Node.js动态更改导出

Node.js changing exports on the fly

本文关键字:js 动态 Node      更新时间:2023-09-26

更改出口。函数中的X似乎不工作…

我希望能够从文件中加载设置&在Node.js中访问它们。我目前有这个,但是,连接到我的节点应用程序的客户端可以编辑设置文件中的内容。不幸的是,必须重新启动Node应用程序才能使更改生效。有没有办法我可以重新加载模块。快速出口?

编辑:

设置文件是一个JSON字符串。

我的设置模块几乎在每个文件中都是"必需的",并且有很多文件…所以按文件重新加载是不可能的。但是,当有人更改设置时,我确实能准确地知道。

如果您正在使用require来加载设置,并且只引用来自一个模块的设置,那么执行以下操作:

delete require.cache[require.resolve(filename)];

适合你。

另一方面,如果多个模块将引用这些设置,那么这种方法可能会变得有点笨拙,并且会导致无法预料的错误。例如,如果任何模块持有对所需设置文件的引用,则它们每个模块都需要以某种方式了解设置已更改并更新其引用。

为了缓解(不是完全解决)缓存问题,您构建设置接口,以便它的用户必须通过函数访问设置对象和/或要求通过函数访问属性。即使有了这个模型,有人仍然可能决定缓存一个设置,在以后的道路上导致一个模糊的失败。

对settings对象使用单个getter的最简单方法是这样的:

var settings = require('./settings.json');
// ... watch for changes and reload by invalidating node's cache
module.exports = function() { return settings; }

用法:

var settings = require('./path/to/settings');
settings().foo;

有几个库可以做设置。根据您的需要,我倾向于使用nconf。

我在这里设置了一个文件监视器,用于动态检查JSON文件的更改。不建议在应用运行后修改JS脚本。

类似:

var _ = require("lodash");
var fs = require("fs");
var result = {};
fs.watch('my-settings.json',function(event,filename){
   fs.readFile(filename,function(err,data){
       if(err){
          // your error catching
       }
       _.extend(result,JSON.parse(data));
   });
});
module.exports = result;

现在,这有很多注意事项,首先是fs。Watch并非所有平台都支持。http://nodejs.org/api/fs.html fs_fs_watch_filename_options_listener

第二,像这样更改属性真的很尴尬。通常期望模块的导出不发生变化。相反,我建议公开一个方法,其结果可以根据文件的状态而改变,即结果数据的getter。

第三,从内存的角度来看,文件监视程序可能会很昂贵。

这是更好的代码,恕我直言:

var _ = require("lodash");
var fs = require("fs");
var filename = 'my-settings.json';
var lastModified;
var mySetting;    
module.exports = {
    getSettingAsync : function (callback) {
        fs.stat(filename,function(err,stat){
            if(stat.mtime == lastModified) {
                callback(mySetting);
            } else {
                fs.readFile(filename,function(err,data){
                   if(err){
                      // your error catching
                   }
                   // this assumes that your data is always correct
                   mySetting = JSON.parse(data).mySetting;
                   callback(mySetting);
               });
            }
        });
    }
};

在本例中,我们检查JSON文件,并将其公开为async方法。如果需要,您也可以简单地更改代码以使用同步版本,并返回值而不是调用回调。这个版本检查文件何时被更改,这比每次读取整个文件便宜,如果文件较新,则读取文件,并且节省了使用可能存在错误的文件监视器的需要。

顺便说一下,我没有测试过这段代码,它可能包含错误,但这个概念是合理的。

但是,也许更重要的问题是,为什么不直接将该值存储在数据库中?