node.js模块变量的不可预测的行为

时间:2017-06-23 16:27:24

标签: javascript node.js sails.js node-modules

我很难弄清楚为什么我的模块不是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
...

2 个答案:

答案 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(全局范围?)时,我的问题就解决了。