Проблема Node require() с 2 скриптами, которые требуют друг друга

#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 выдавал некоторые предупреждения о наличии циклической зависимости и говорил, что он не загружает модуль, чтобы нам не приходилось проходить через отладчик и пытаться выяснить, почему наши коды не работают.