2014-06-12 49 views
1

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

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(); } 
}; 

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

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

我应该使用回调拖延运行任何代码,直到我的所有模块已成功加载?为什么require()在完全独立的文件中的顺序会影响到暴露方法?

回答

0

您对slack.jsmqtt.js之间存在循环依赖关系。有关详细信息,请参阅the node.js docs on require cycles,但正确的解决方案通常是完全删除循环依赖。这是一个指标,表明你的设计耦合还不完全正确。