节点模块是否需要对方?
我有以下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和传递正确的实例到Room
和User
,而不是让他们直接实例化这些。
我认为有更好的方法如何做到这一点。 只需切换导出,并需要这样的:
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