【问题标题】:Ordering of require() seems to affect modulesrequire() 的排序似乎会影响模块
【发布时间】:2014-06-12 22:22:46
【问题描述】:

我正在编写一个非常基本的 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 # has no method 'postToSlack'

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

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

【问题讨论】:

    标签: javascript node.js module require


    【解决方案1】:

    slack.jsmqtt.js 之间存在循环依赖关系。阅读the node.js docs on require cycles 了解详细信息,但这种情况的正确解决方案通常是完全移除循环依赖。这表明您的设计耦合还不太正确。

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 2013-08-12
      • 2012-01-03
      • 2012-03-20
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 2013-06-28
      • 2012-10-22
      相关资源
      最近更新 更多