Node.js: переменная область видимости ведет себя по-разному в электронном и неэлектронном сценарии - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь создать версию одного из моих приложений Electron для командной строки в виде Node.js сценария. Для начала я скопировал код из моего приложения Electron, но он не ведет себя так же. В качестве примера, у меня есть два модуля, которые я создал. При вызове webscraper.scrape() в приложении Electron код выполняется должным образом. Однако, когда я вызываю функцию в простом скрипте Node.js, она выдает "database is not defined error". При тестировании с другими переменными кажется, что никакие переменные, которые я определяю в main.js, не доступны ни в одном из моих модулей, что противоположно тому, как это было в моем приложении Electron.

Это ожидаемое поведение? Как я могу сделать мои переменные доступными для моих модулей? Это плохая практика, и если да, то как я могу улучшить как свои Electron, так и Nods. js сценарии?

// main.js
var database = require('./src/database.js');
var webscraper = require('./src/webscraper.js');

database.init().then(()=> {
    webscraper.scrape();
});
// webscraper.js
exports.scrape = function() {
    // Find where we left off
    database.connection.query('SELECT `last_searched` FROM `post_index` WHERE `id` = 0', function (err, results) {
        if (err) throw err;
        ...
    });
}

1 Ответ

0 голосов
/ 25 февраля 2020

В node.js переменная базы данных в main. js доступна ТОЛЬКО в области действия модуля main. js, где вы ее импортировали. Если вы хотите, чтобы он был доступен в webscraper. js, то вам нужно импортировать его туда или передать в качестве аргумента. Каждый модуль должен импортировать то, что ему нужно. Это позволяет модулям явно называть свои зависимости, упрощает их совместное использование или повторное использование и упрощает их тестирование. Эта практика поощряет «хороший дизайн модуля».

В вашем конкретном случае c вы можете / должны передать экземпляр database в вашу функцию scrape(), чтобы он мог использовать тот, который вы уже инициализировали.

Вот один из способов решения этой проблемы (путем передачи экземпляра database в функцию scrape() в качестве аргумента):

// main.js
var database = require('./src/database.js');
var webscraper = require('./src/webscraper.js');

database.init().then(()=> {
    webscraper.scrape(database);
});

// webscraper.js
exports.scrape = function(database) {
    // Find where we left off
    database.connection.query('SELECT `last_searched` FROM `post_index` WHERE `id` = 0', function (err, results) {
        if (err) throw err;
        ...
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...