一尘不染

节点模块可以互相要求吗

node.js

我有以下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中的User被index.js中的User隐藏了。

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


阅读 241

收藏
2020-07-07

共1个答案

一尘不染

查看http://nodejs.org/api/modules.html#modules_cycles,了解如何在node中进行处理。

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

// 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需要创建新的东西,Rooms并且Room需要创建新的东西Users,似乎他们都负有太多责任。可能您需要第三个组件,该组件负责创建正确的实例并将其传递给Roomand
User,而不是让它们直接实例化它们。

2020-07-07