require()的排序似乎影响模块

时间:2014-06-12 22:22:46

标签: javascript node.js module require

我正在编写一个包含三个组件的非常基本的Node应用程序:index.js,mqtt.js,slack.js。 mqtt和slack模块都使用module.exports公开它们的一些方法。但是,我只能向一个方向公开文件。代码示例:

index.js:

var slack = require('./slack');
var mqtt = require('./mqtt');

var client;

mqtt.connectMQTT(client);
slack.startServer();

slack.js:

var mqtt = require('./mqtt');
module.exports = {
startServer: function() { //blahblah },
postToSlack: function() { //blahblah }
};

mqtt.js:

var slack = require('./slack');
module.exports = {
connectClient: function() { //blahblah },
handleMessage: function() { slack.postToSlack(); }
};

现在,当我尝试从mqtt.js调用postToSlack()时,Node给了我:TypeError:Object#没有方法' postToSlack'

但是,当我在index.js中交换两个require()的行位置时,现在我可以从mqtt调用方法,但不能从slack调用方法。错误已反映出来。我可以从index.js调用方法就好了。

在我的所有模块成功加载之前,我是否应该使用回调来阻止运行任何代码?为什么完全独立的文件中require()的顺序会影响公开方法?

1 个答案:

答案 0 :(得分:0)

slack.jsmqtt.js之间存在循环依赖关系。有关详细信息,请阅读the node.js docs on require cycles,但正确解决此问题的方法通常是完全删除循环依赖项。这表明您的设计耦合还不是很正确。