将其分解并简化一下:想象一下,我的项目中有三个文件。一个main.js和两个模块:moduleA.js和moduleB.js。 main.js访问moduleA.js,它从moduleB.js调用一个函数。现在,moduleB.js发现它需要一个仅在moduleA.js中可用的信息。当然,moduleB.js尝试访问moduleA.js中的一个函数,该函数在技术上能够将此信息提供给moduleB.js,但是存在错误。
这是简化的代码。
main.js
var a = require("./moduleA.js");
console.log(a.respond());
moduleA.js
var b = require("./moduleB.js");
module.exports = {
respond: function(){
return b.returnAnswerForModuleA();
},
getSomeInformationOnlyAvailableInA: function(){
return "This is the information we need!";
}
};
moduleB.js
var a = require("./moduleA.js");
module.exports = {
returnAnswerForModuleA: function(){
return a.getSomeInformationOnlyAvailableInA()
}
};
以下是错误消息:
/Users/Tim/Code/ChatBot/test/moduleB.js:5
return a.getSomeInformationOnlyAvailableInA()
^
TypeError: a.getSomeInformationOnlyAvailableInA is not a function
at Object.module.exports.returnAnswerForModuleA (/Users/Tim/Code/ChatBot/test/moduleB.js:5:16)
at Object.module.exports.respond (/Users/Tim/Code/ChatBot/test/moduleA.js:5:18)
at Object.<anonymous> (/Users/Tim/Code/ChatBot/test/main.js:3:15)
at Module._compile (module.js:425:26)
at Object.Module._extensions..js (module.js:432:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Function.Module.runMain (module.js:457:10)
at startup (node.js:136:18)
at node.js:972:3
为什么我无法从moduleB.js访问moduleA.js?
重组我的代码不是一个真正的选择!
感谢您的帮助!
答案 0 :(得分:1)
这看起来像node.js中循环依赖的问题,其中循环依赖导致一个模块被解析为空对象(从而导致您看到的错误)。请参阅以下文章解释:
Node.js and circular dependencies
Circular dependencies in Node.js
第一篇文章提供了两种可能的解决方案:“延迟调用依赖直到运行时”和“用依赖注入替换循环依赖”。
我认为您可以通过将模块B更改为此来解决循环问题:
var moduleA;
module.exports = {
returnAnswerForModuleA: function(){
if (!moduleA) {
moduleA = require("./moduleA.js");
}
return moduleA.getSomeInformationOnlyAvailableInA()
}
};
这延迟了模块B中模块A的加载,直到运行时,它已经成功加载并且在模块缓存中,从而避免了循环依赖。