要求两个目录中的相同本地节点模块导致两个副本

时间:2013-09-30 14:40:01

标签: node.js

我的项目结构的根目录中有一个模块(server.js)。它在名为lib:

的目录中包含一个模块
var mongo = require('./lib/MongoUtils');

lib目录中的另一个模块也需要' MongoUtils'模块,所以它确实:

var mongo = require('./MongoUtils');

问题是我最终得到了两个对象副本(这很糟糕,因为它有一些系统资源,如数据库连接等)。

我已经阅读了Node.js缓存警告文档(http://nodejs.org/api/modules.html#modules_module_caching_caveats),因此问题似乎是我指的是具有两个不同路径的相同模块,因此Node.js给了我两份。这种理解是否正确?

我该如何解决这个问题?我不想将我的模块转储到node_modules中,因为那是由npm通过我的package.json(和.gitignore-d)管理的。我想把我的本地模块放在package.json中(假设可能),但是我需要运行  npm install'每当我做出改变时。

如果不能干净利落地完成这项工作,我只需将模块装入一个地方并将其传递出去,但如果我的模块出现这种情况,那么这听起来并不可扩展。< / p>

1 个答案:

答案 0 :(得分:0)

我解决了。事实证明我错误地记录了我的一个模块的大写。 Node.js愉快地加载了模块并且工作正常,唯一的副作用是我将模块加载了两次。

这是一个例子。请注意lib1.js中require语句中的大写字母B.

main.js:

var lib1 = require('./lib/lib1')
    , lib2 = require('./lib/lib2');

LIB / lib1.js:

var lib2 = require('./liB2');

LIB / lib2.js:

function MyClass() {
    console.log('Constructor called');
}

module.exports = new MyClass();

如果您运行“node main.js”,您将获得以下输出:

Constructor called
Constructor called

如果您在lib1.js中修复大写B并再次运行它,您将看到:

Constructor called