不修改加载的节点模块

时间:2013-10-01 12:13:04

标签: node.js javascript

在我的Node应用程序中,有一个这样的配置文件:

module.exports = {
    BUILD_DIR: '/some.path',
    OTHER_CONFIG: 42,
    // ...
};

我也有一些测试,比如

var appConfig = require('./path/to/appConfig');
appConfig.BUILD_DIR = 'tmp/some/path';
// and stuff done with appConfig

令我惊讶的是,这样做显然会修改模块的状态。我需要它的下一个测试将BUILD_DIR设置为'tmp / some / path'。我没有意识到模块在需要时有这种状态。如何在测试中摆脱这种影响?另外,如何防止人们修改此模块的状态?如果有人包含它,它们应该总是得到它定义的内容,而不是其他代码写给它的东西。

2 个答案:

答案 0 :(得分:1)

is explained here

的原因
  

模块在第一次加载后进行缓存。这意味着   (除此之外)每次拨打require('foo') 都会得到   完全相同的对象返回,如果它将解析为相同   文件。

(强调我的)

因此,您导出的对象将被缓存并在使用它的代码之间共享。

如果这不是你想要的,你可以改为导出一个函数:

module.exports = function() {
  return {
    BUILD_DIR: '/some.path',
    OTHER_CONFIG: 42,
    // ...
  };
};

require就像这样:

var appConfig = require('./path/to/appConfig')();

答案 1 :(得分:1)

假设您的模块名为“Config”,而您原来是:

var Config=require('Config');
你可以:

delete require.cache[require.resolve('Config')];

将从require的缓存中删除该模块,导致它在您下次“需要”时重新加载。

要点:https://gist.github.com/raisch/6786930