Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node require()与两个相互需要的脚本一起出现问题_Javascript_Node.js - Fatal编程技术网

Javascript Node require()与两个相互需要的脚本一起出现问题

Javascript Node require()与两个相互需要的脚本一起出现问题,javascript,node.js,Javascript,Node.js,我有两个不同的节点脚本save_info.js从sse_server.js导入openConections数组。并且,sse_server.js从save_info.js导入功能广播。 但是,这会导致openConnections数组在save_info.js中被未定义。这是为什么?我该如何解决 保存_info.js: var openConnections = require('../scripts/sse_server.js').openConnections; function broa

我有两个不同的节点脚本
save_info.js
sse_server.js
导入
openConections数组
。并且,
sse_server.js
save_info.js
导入
功能广播。
但是,这会导致
openConnections数组
save_info.js
中被
未定义
。这是为什么?我该如何解决

保存_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: }' + '\n\n');
}

 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;

为了防止循环依赖,nodejs模块加载器停止在save_info.js中加载sse_服务器模块,这就是openConnections未定义的原因。要解决此问题,请执行以下操作:

1) 将broadcast()移出到单独的模块中(例如broadcast.js)

2) 将require('../data/broadcast.js')放在sse_server.js和save_info.js中


3) 删除sse_server.js中的require('../data/save_info')

在这些文件上运行require将使它们每次执行两次。这意味着a加载b,b加载a,然后使用a。。。但是a没有定义b,因为使用的a实例不是第一个。相关问题,解释语言中处理循环依赖的典型方法是什么?我能想到的最好的方法是一个C风格的“头”,带有“原型”,在解析后的某个时刻被“链接”。像懒惰的要求。我希望有一个工作,而不是这个…但足够好。我认为node以某种方式处理了循环依赖,这样它们就不会发生。模块加载器停止加载是为了防止循环依赖,我们只能防止循环依赖。我想这就是我们的工作。我希望node给出一些警告,指出存在循环依赖关系,并说它没有加载模块,这样我们就不必通过调试器来找出代码无法工作的原因。