1

我有一个关于在节点中加载外部文件的问题。

基本上我正在加载一个包含一些配置的外部 JSON 文件,并且该文件每 10 分钟由外部进程修改一次。如何在不重新启动节点的情况下每 10 分钟重新加载此文件?

我试过这个解决方案:

delete require.cache['/home/conf/myfile.json']

但有些人反对它。有谁能够帮助我?

4

3 回答 3

4

最后,我更改了代码,现在使用 fs.readFile 来加载我的 json 文件,而不是使用 require。

然后我使用node-watch检查文件中的更改并重新加载它。

于 2013-10-07T21:44:48.830 回答
2

几个选项。您可以只使用setInterval 10 分钟,然后在回调中读取文件。否则,您可以使用fs.watch并在文件实际更改时触发重新加载。

根据评论更新

如果您使用 require,它只会加载文件一次,无论您需要多少次,并且实际上并没有使所需文件无效的机制。您可以围绕功能创建一个包装器并要求它。您的包装器是您需要的文件,它公开了一个返回当前配置的函数。在该模块中,您可以创建上面提到的 setTimeout 刷新。

于 2013-10-07T20:59:21.997 回答
0

您可以查看我的module-invalidate模块,它允许您使所需模块无效。然后,该模块将在进一步访问时自动重新加载。

例子:

模块./myModule.js

module.invalidable = true;
var count = 0;
exports.count = function() {

    return count++;
}

主模块./index.js

require('module-invalidate');

var myModule = require('./myModule.js');

console.log( myModule.count() ); // 0
console.log( myModule.count() ); // 1

setInterval(function() {

    module.constructor.invalidateByExports(myModule);

    console.log( myModule.count() ); // 0
    console.log( myModule.count() ); // 1

}, 10*60*1000);
于 2017-03-02T14:52:37.003 回答