#javascript #node.js
#javascript #node.js
Вопрос:
У меня есть 2 разных сценария узла… save_info.js
импортирует openConections array
из sse_server.js
. И, sse_server.js
импортирует function broadcast
из save_info.js
. Однако это приводит openConnections array
к undefined
тому, что внутри save_info.js
. Почему это и как я могу это исправить?
save_info.js:
var openConnections = require('../scripts/sse_server.js').openConnections;
function broadcast(result, event, httpObject) {
var result = JSON.stringify(result);
var date = new Date().getMilliseconds();
httpObject.write('id: ' date 'n');
httpObject.write('data: { "' event '":n');
httpObject.write('data:' result 'n');
httpObject.write('data: }' 'nn');
}
function db_finish(err, product, numberAffected,
result, event) {
if (err) { console.log(err) }
else {
console.log("Db insert successfull");
openConnections.forEach(function(httpObject) {
broadcast(result, event, httpObject);
});
}
console.log("Numer effected " numberAffected);
}
module.exports.openConnections = openConnections;
sse_server.js:
var broadcast = require("../data/save_info").broadcast;
var openConnections = [];
for (var model in models){
models[model].find({}).sort({_id: -1}).limit(1).exec(
function (err, result){
broadcast(result, model, res);
});
}
module.exports.broadcast = broadcast;
Комментарии:
1. взаимный запуск require для этих файлов приведет к тому, что они будут выполняться каждый раз дважды. Это означает, что a загружает b, а b загружает a, затем использует a … но a не имеет определения b, потому что используемый экземпляр a не является первым.
2. Связанный с этим вопрос, каков типичный подход к обработке циклических зависимостей на интерпретируемых языках? Лучшее, что я могу придумать, это «заголовок» в стиле C с «прототипами», который «связывается» в какой-то момент после его анализа. Что-то вроде lazy-require.
Ответ №1:
Чтобы предотвратить циклическую зависимость, загрузчик модуля nodejs останавливает загрузку модуля sse_server в save_info.js Вот почему openConnections не определено. Чтобы решить эту проблему, выполните следующие действия:
1) Переместить broadcast() в отдельный модуль (broadcast.js например).
2) поставить require(‘../data/broadcast.js ‘) в обоих sse_server.js и save_info.js
3) Удалите require(‘../data/ save_info’) в sse_server.js
Комментарии:
1. Я надеялся, что вместо этого есть обходной путь … но достаточно хороший. Я думал, что узел каким-то образом обрабатывает зависимости круга, чтобы они не возникали.
2. загрузчик модулей прекращает загрузку, чтобы предотвратить циклические зависимости, так что мы мало что можем сделать, кроме как предотвратить это. Я думаю, это обходной путь. Я бы хотел, чтобы node выдавал некоторые предупреждения о наличии циклической зависимости и говорил, что он не загружает модуль, чтобы нам не приходилось проходить через отладчик и пытаться выяснить, почему наши коды не работают.