我很难弄清楚为什么我的模块不是sigleton,因为它应该是默认的,以及为什么它的变量突然重置。任何使变量成为module.exports对象成员的尝试都会产生不可预测的行为。
这对我来说完全不和,我将不胜感激。
//target module, ./api/models/person/index.js:
"use strict";
module.exports = {};
var own_counter = 0;
module.exports.setup = function () {
console.log('setup, pre own_counter = ' + own_counter);
++own_counter;
console.log('setup, post own_counter = ' + own_counter);
}
//first use, ./api/hooks/sequelizeConnecionsInit/index.js:
...
initialize: function(done){
var person_orm = require('../../models/person');
person_orm.setup();
person_orm.setup();
return done();
},
...
//second use, ./node_modules/sails-userhooks-ws/index.js:
...
var person_orm = require('../../api/models/person');
person_orm.setup();
...
//(its wrong to write code to node_modules, but I havent figured out yet how to use it with my code without module code change)
//Output:
...
setup, pre own_counter = 0
setup, post own_counter = 1
setup, pre own_counter = 1
setup, post own_counter = 2
...
setup, pre own_counter = 0 //Why resetted???
setup, post own_counter = 1
...
答案 0 :(得分:0)
阅读文档。不只是一些文档。所有的文档。例如,这里的这一部分解释了你的问题Module Caching Caveats重点是我的。
模块缓存警告
模块根据其解析的文件名进行缓存。由于模块可能会根据调用模块的位置(从node_modules文件夹加载)解析为不同的文件名,不保证需要(' foo')将始终返回完全相同的对象,如果它将解析为不同的文件。
此外,在不区分大小写的文件系统或操作系统上,不同的已解析文件名可以指向同一个文件,但缓存仍会将它们视为不同的模块,并会多次重新加载该文件。例如,require(' ./ foo')和require(' ./ FOO')返回两个不同的对象,无论./foo和./FOO是否相同文件。
答案 1 :(得分:0)
原因在于:
http://justbuildsomething.com/node-js-best-practices/#2
在第一次和第二次使用中,我在函数内部调用require,所以当我将它移动到head(全局范围?)时,我的问题就解决了。