我有一个关于在节点中加载外部文件的问题。
基本上我正在加载一个包含一些配置的外部 JSON 文件,并且该文件每 10 分钟由外部进程修改一次。如何在不重新启动节点的情况下每 10 分钟重新加载此文件?
我试过这个解决方案:
delete require.cache['/home/conf/myfile.json']
但有些人反对它。有谁能够帮助我?
我有一个关于在节点中加载外部文件的问题。
基本上我正在加载一个包含一些配置的外部 JSON 文件,并且该文件每 10 分钟由外部进程修改一次。如何在不重新启动节点的情况下每 10 分钟重新加载此文件?
我试过这个解决方案:
delete require.cache['/home/conf/myfile.json']
但有些人反对它。有谁能够帮助我?
最后,我更改了代码,现在使用 fs.readFile 来加载我的 json 文件,而不是使用 require。
然后我使用node-watch检查文件中的更改并重新加载它。
几个选项。您可以只使用setInterval 10 分钟,然后在回调中读取文件。否则,您可以使用fs.watch并在文件实际更改时触发重新加载。
根据评论更新
如果您使用 require,它只会加载文件一次,无论您需要多少次,并且实际上并没有使所需文件无效的机制。您可以围绕功能创建一个包装器并要求它。您的包装器是您需要的文件,它公开了一个返回当前配置的函数。在该模块中,您可以创建上面提到的 setTimeout 刷新。
您可以查看我的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);