我最近一直在使用nodejs,仍然在掌握模块系统,所以如果这是一个显而易见的问题,很抱歉。我想要大致如下所示的代码:
a.js (与节点一起运行的主文件)
var ClassB = require("./b");
var ClassA = function() {
this.thing = new ClassB();
this.property = 5;
}
var a = new ClassA();
module.exports = a;
b.js
var a = require("./a");
var ClassB = function() {
}
ClassB.prototype.doSomethingLater() {
util.log(a.property);
}
module.exports = ClassB;
我的问题似乎是我不能从ClassB实例中访问ClassA实例。
有没有一种正确的/更好的方法来组织模块来实现我想要的?有没有更好的方法在模块之间共享变量?
发布于 2012-06-04 02:49:14
虽然node.js确实允许循环require
依赖,但您已经发现它可以是pretty messy,您最好将代码重组为不需要它。也许可以创建第三个类,它使用另外两个类来完成您需要的任务。
发布于 2012-06-04 02:54:03
尝试在module.exports
上设置属性,而不是完全替换它。例如,a.js
中的module.exports.instance = new ClassA()
,b.js
中的module.exports.ClassB = ClassB
。当您建立循环模块依赖关系时,请求模块将从所需模块获得对不完整module.exports
的引用,您可以稍后添加其他属性,但当您设置整个module.exports
时,您实际上创建了一个请求模块无法访问的新对象。
发布于 2014-01-22 00:51:11
EDIT it not 2015年,大多数库(即express)已经更新了更好的模式,因此循环依赖不再是必要的。我建议简单地不要使用它们。
我知道我在挖掘一个古老的答案...这里的问题是,module.exports是在您需要ClassB之后定义的。(JohnnyHK的链接显示)循环依赖在Node中工作得很好,它们只是同步定义的。如果使用得当,它们实际上解决了许多常见的节点问题(比如从其他文件访问express.js app
)。
只需确保在需要具有循环依赖关系的文件之前定义了必要的导出。
这将中断:
var ClassA = function(){};
var ClassB = require('classB'); //will require ClassA, which has no exports yet
module.exports = ClassA;
这将会起作用:
var ClassA = module.exports = function(){};
var ClassB = require('classB');
我一直使用这个模式来访问其他文件中的express.js app
:
var express = require('express');
var app = module.exports = express();
// load in other dependencies, which can now require this file and use app
https://stackoverflow.com/questions/10869276
复制相似问题