关注另一个question后,我了解到我正面临module caching caveat issue。显然,在我的项目中创建了同一模块的几个实例。
我要求位于不同文件夹中的其他模块的模块:
var mm = require("./myModule.js");
...
var mm = require("../myDir/myModule.js");
...
var mm = require("../../MyDir/myModule.js");
...
我一直在尝试使用对象并通过导出来创建myModule
(单例)的唯一实例:
var myModule = function() {
if (!(this instanceof myModule)) { return new myModule(); }
...
};
...
module.exports = new myModule();
然而,它并没有解决问题。在node.js中声明单例的正确方法是什么?以及如何在其他模块中检索实例?
答案 0 :(得分:3)
这是一个Windows问题:Windows中的文件路径不区分大小写,因此./File.txt
和./file.txt
引用相同的文件。问题是,该节点不知道这一点,并使用已解析的文件路径作为缓存键,因此可以使用不同的外壳多次加载相同的模块。
有关该问题和讨论的更多信息:https://github.com/joyent/node/issues/6000
解决方案(种类):不要在节点项目中的文件和目录名称中使用大写
答案 1 :(得分:-1)
这种模式绝对适用于单身人士。
// singleton.js
module.exports = new Singleton
function Singleton () {
this.rand = Math.random()
}
// one.js
var singleton = require('./singleton')
console.log(singleton.rand)
// two.js
require('./one')
var singleton = require('./singleton')
console.log(singleton.rand)
果然输出一致。
0.7851003650575876
0.7851003650575876