Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 不修改加载的节点模块_Node.js_Javascript - Fatal编程技术网

Node.js 不修改加载的节点模块

Node.js 不修改加载的节点模块,node.js,javascript,Node.js,Javascript,在我的节点应用程序中,有如下配置文件: 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 令我大吃一惊的是,这样做

在我的节点应用程序中,有如下配置文件:

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\u DIR
设置为“tmp/some/path”。我没有意识到模块在不同的需求中都有这种状态。如何在测试中消除这种影响?此外,如何防止人们修改此模块的状态?如果有人包含它,他们应该总是得到它定义的内容,而不可能是其他代码写入的内容。

原因:

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

(强调矿山)

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

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

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

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

假设您的模块名为“Config”,并且您最初:

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

delete require.cache[require.resolve('Config')];
这将从require的缓存中删除该模块,使其在下次“require”时重新加载


要点:

这实际上不起作用,我的修改仍然会出现在我的另一个测试中。如果我在函数中执行“returnextend({},{..config..})”,那么它就可以工作了。应该是这样的,因为每次调用函数时,函数返回的对象都是新创建的,即使函数本身是缓存的。我把配置放在一个变量中,然后通过函数返回。一步一个完成。@JeroenDeDauw啊,对了,如果你每次都返回相同的var,你只是传递了一个对同一个对象的引用:)(
extend
也创建了一个新对象,这就是为什么这个路由也起作用的原因)我主要是一个PHP开发人员,习惯于“关联数组”不通过引用传递的:)有趣。但是,这确实让所有呼叫者有责任在需要时进行删除。容易发生位错误,导致的错误可能不是很局部。实际上,执行上述操作的唯一影响是能够重新加载模块。删除缓存后,原始加载仍然可用,因此唯一可能的副作用是,如果您以不兼容的方式更改了对系统操作特别重要的内容。