当前位置: 首页 > 面试题库 >

节点模块可以互相要求吗

长孙景天
2023-03-14
问题内容

我有以下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隐藏了。

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


问题答案:

查看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,而不是让它们直接实例化它们。



 类似资料:
  • 我查看了其他项目,如babel或react-router,其中模块被拆分为几个包,使用lerna和yarn包。所以我尝试用不同的包来构建lerna库: 我希望中的文件仅在需要时并且仅在安装了node-module时才能从中调用中的方法。但我一直没有找到解决办法。使用/和/是否可以实现这一点?还是我采取了错误的方法? 更新10月27日 因此,经过几次测试,我能够使用带有普通HTML/JS(https

  • 我用请求模块和异步模块的组合并行爬行了很多链接 我注意到很多和错误,尽管使用chrome可以访问链接并快速响应。 在请求选项中,我将限制为2,将限制为10000。我使用限制为2的来减少每次请求的并行性。所以我有2套接字,2个请求和10秒的超时时间来等待来自服务器的头响应,但我得到了这些错误。 在这里s我使用的请求配置: 以下是我用来生成链接的代码片段: 我听了错误事件,我看到每当错误代码为时,co

  • 我有一个简单的Maven项目,看起来像这个项目视图 有一个主要的pom。xml如下所示: 有两个模块-核心和测试。核心模块pom.xml: 测试模块pom。xml 我想使用核心内部测试的代码。这种依赖性看起来是正确的。该项目已生成,没有错误: 但是,当我在测试中尝试从core导入一个类时,找不到该类。

  • (网页包)/buildin/global。js有多个模块,它们的名称只是大小写不同。在具有其他case语义的文件系统上编译时,这可能会导致意外行为。使用相等的外壳。比较这些模块标识符: C:\Users\user\Desktop\projects\LINK\LinkparmacySystem\node\u modules\react scripts\node\u modules\babel loa

  •   DOM节点操作占我们前端工作很大一部分,其节点的操作又占50%以上。由于选择器引擎的出现,让繁琐的元素选择简单化,并且一下子返回一大堆元素,这个情景时刻暗示着我们操作元素就像css为元素添加样式那样,一操作就操作一组元素。 一些大胆的API设计被提出来。当然我们认为时髦新颖的设计其实都是很久以前被忽略的设计或者其它领域的设计。例如:集化操作,这是数据库层里边的ROM就有的。链式操作,javas

  • 问题内容: 我需要检查文件/(自定义)模块js是否存在于某些路径下。我试过像 但是当路径中没有per.js时,它将引发错误。我本来想检查文件是否存在,但如果不进行检查, 我不想添加后缀。如何检查节点是否存在模块以及是否存在要加载的模块? 问题答案: Require是一个同步操作,因此您可以将其包装在try / catch中。