Expressjs中间件保持变量变化

问题描述 投票:0回答:1

我正在尝试做一个很简单的事情,我相信下面的代码:

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变量。

知道为什么会发生这种令人毛骨悚然的事情的人?

谢谢

javascript node.js express middleware
1个回答
0
投票

主要问题是require()被缓存,因此require('../../config/config')返回对同一实例的引用,因此在一个地方更改会导致所有其他引用和后续requires获取该修改后的实例。

最简单的解决方案是在config中有一个函数来返回一个配置对象,这样每次调用get config函数时你都会获得一个具有基本相同内容的新实例。即:

config.js:

module.exports = {
  getDefaultOptions: function(){
    return {foo: 'bar', ip: '1.1.1.1'}
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.