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给出一些警告,指出存在循环依赖关系,并说它没有加载模块,这样我们就不必通过调试器来找出代码无法工作的原因。