我正在尝试做一个很简单的事情,我相信下面的代码:
module.exports = function(req, res, next) {
var dop = require('../../config/config').DefaultOptions;
console.log(require('../../config/config').DefaultOptions);
console.log(dop);
dop.firstPage = 'test.sjs';
next();
};
这是一个非常简单的Expressjs中间件,但有趣的是下次我加载一个页面时,两个console.log结果都被改为'firstPage:test.sjs'。它不应该像这样,它应该只改变dop变量。
知道为什么会发生这种令人毛骨悚然的事情的人?
谢谢
主要问题是require()被缓存,因此require('../../config/config')
返回对同一实例的引用,因此在一个地方更改会导致所有其他引用和后续require
s获取该修改后的实例。
最简单的解决方案是在config中有一个函数来返回一个配置对象,这样每次调用get config函数时你都会获得一个具有基本相同内容的新实例。即:
config.js:
module.exports = {
getDefaultOptions: function(){
return {foo: 'bar', ip: '1.1.1.1'}
}
};