节点模块是否需要对方?

我有以下3个文件。

user.js需要room.js和room.js需要user.js。

user.js的

var Room = require('./room.js'); var User = function () {}; User.prototype.test = function () { return new Room(); }; module.exports = User; 

room.js

 var User = require('./user.js'); var Room = function () {}; Room.prototype.test = function () { return new User(); }; module.exports = Room; 

index.js

 var User = require('./user.js'); var Room = require('./room.js'); var user = new User(); var room = new Room(); user.test(); room.test(); 

index.js需要房间和用户。

这是问题。 当我运行index.js时,我会在room.js中从'new User()'得到一个TypeError。 看来room.js中的用户在index.js中被用户隐藏了。

我做错了什么? 这种要求是否允许? 有任何想法吗? 谢谢。

查看http://nodejs.org/api/modules.html#modules_cycles ,了解它在节点中的处理方式。

你可以通过几种方式来解决你的问题,比如把依赖关系传递给dependency injection的实例

 // user.js var User = function (Room) { this.Room = Room; }; User.prototype.test = function () { return new this.Room(); }; module.exports = User; // room.js var Room = function (User) { this.User = User; }; Room.prototype.test = function () { return new this.User(); }; module.exports = Room; // index.js var User = require('./user.js'); var Room = require('./room.js'); var user = new User(Room); var room = new Room(User); 

另一种方法是仅在需要时才需要文件

 // user.js var User = function () {}; User.prototype.test = function () { var Room = require('./room'); return new Room(); }; module.exports = User; // room.js var Room = function () {}; Room.prototype.test = function () { var User = require('./user'); return new User(); }; module.exports = Room; // index.js var User = require('./user.js'); var Room = require('./room.js'); var user = new User(Room); var room = new Room(User); 

像这样,您的出口是由您需要的时间来定义的。

但是一般来说,如果你有循环依赖,你做错了,应该考虑你的架构。 如果一个User需要创build新的Rooms而一个Room需要创build新的Users ,似乎他们都有太多的责任。 可能你会想要第三个组件负责创build和传递正确的实例到RoomUser ,而不是让他们直接实例化这些。

我认为有更好的方法如何做到这一点。 只需切换导出,并需要这样的:

user.js的

 var User = function () {}; module.exports = User; User.prototype.test = function () { return new Room(); }; var Room = require('./room.js'); 

room.js

 var Room = function () {}; module.exports = Room; Room.prototype.test = function () { return new User(); }; var User = require('./user.js'); 

index.js

 var User = require('./user.js'); var Room = require('./room.js'); var user = new User(); var room = new Room(); user.test(); room.test(); 

检查这篇文章: https : //coderwall.com/p/myzvmg/circular-dependencies-in-node-js