在我的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'。我没有意识到模块在需要时有这种状态。如何在测试中摆脱这种影响?另外,如何防止人们修改此模块的状态?如果有人包含它,它们应该总是得到它定义的内容,而不是其他代码写给它的东西。
答案 0 :(得分:1)
模块在第一次加载后进行缓存。这意味着 (除此之外)每次拨打
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的缓存中删除该模块,导致它在您下次“需要”时重新加载。