节点模块可以相互需要

Ziy*_*iyu 23 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;
Run Code Online (Sandbox Code Playgroud)

room.js

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

var Room = function () {};
Room.prototype.test = function () {
  return new User();
};

module.exports = Room;
Run Code Online (Sandbox Code Playgroud)

index.js

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

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

user.test();
room.test();
Run Code Online (Sandbox Code Playgroud)

index.js需要房间和用户.

这是问题所在.当我运行index.js时,我将从room.js中的'new User()'获取一个TypeError.似乎用户在index.js中隐藏了room.js中的User.

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

The*_*eme 24

查看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);
Run Code Online (Sandbox Code Playgroud)

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

// 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();
Run Code Online (Sandbox Code Playgroud)

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

但一般来说,如果你有循环依赖,你做错了,应该考虑你的架构.如果User需要创造新的RoomsRoom需要创造新的Users,似乎他们都有太多的责任.也许你会想要第三个组成部分是负责创建和传递正确的情况下,向RoomUser,而不是让他们直接实例化的.


bal*_*ekt 12

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

user.js的

var User = function () {};
module.exports = User;    

User.prototype.test = function () {
    return new Room();
};

var Room = require('./room.js');
Run Code Online (Sandbox Code Playgroud)

room.js

var Room = function () {};
module.exports = Room;    

Room.prototype.test = function () {
  return new User();
};

var User = require('./user.js');
Run Code Online (Sandbox Code Playgroud)

index.js

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

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

user.test();
room.test();
Run Code Online (Sandbox Code Playgroud)

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