节点模块可以相互需要

时间:2014-04-28 13:01:48

标签: javascript node.js node-modules

我有以下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时,我将从' new User()'中获得一个TypeError。在room.js.似乎用户在index.js中隐藏了room.js中的用户。

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

3 个答案:

答案 0 :(得分:23)

查看http://nodejs.org/api/modules.html#modules_cycles有关如何在节点中处理此问题的方法。

您可以通过多种方式解决问题,例如将依赖项传递给实例,即依赖注入

// 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();
var room = new Room();

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

但一般来说,如果你有循环依赖,你做错了什么,应该考虑你的架构。 如果User需要创建新的RoomsRoom需要创建新的Users,那么他们似乎都有太多的责任。 可能你需要第三个组件负责创建并将正确的实例传递给RoomUser,而不是让它们直接实例化它们。

答案 1 :(得分:12)

我认为有更好的方法可以做到这一点。只需切换导出并要求如下:

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

答案 2 :(得分:0)

两者之间的区别:

/* code above */
function a() {};

/* code above */
var a = function () {};

在第一个示例a中将是{strong>函数在code above中已经存在,但在第二个示例中不是。

了解到您可以使用以下简单解决方案:

// user.js

module.exports = User;

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

// room.js

module.exports = Room;

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

// index.js

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

var user = new User(Room);
var room = new Room(User);