Javascript Node.js动态更改导出

Javascript Node.js动态更改导出,javascript,node.js,Javascript,Node.js,在函数中更改exports.X似乎不起作用 我希望能够从文件加载设置并在Node.js中访问它们。我目前有这个功能,但是,连接到我的节点应用程序的客户端可以编辑设置文件中的内容。不幸的是,目前的情况是,必须重新启动节点应用程序才能使更改生效。有没有办法可以在运行中重新加载module.exports 编辑: 设置文件实际上是一个JSON字符串 我的设置模块在几乎每个文件中都是“必需的”,而且有很多文件。。。因此,按文件重新加载它是不可能的。但是,我确实知道有人何时更改设置。我在这里设置了一个文件

在函数中更改exports.X似乎不起作用

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

编辑:

设置文件实际上是一个JSON字符串


我的设置模块在几乎每个文件中都是“必需的”,而且有很多文件。。。因此,按文件重新加载它是不可能的。但是,我确实知道有人何时更改设置。

我在这里设置了一个文件监视程序,动态检查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。

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

第三,文件监视程序可能很昂贵,而且内存方面也很重要

这是更好的代码,IMHO:

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文件,并将其作为异步方法公开。如果需要,您可以同样轻松地更改代码以使用同步版本,并返回值,而不是调用回调。此版本检查文件的更改时间(这比每次读取整个文件便宜),如果文件较新,则读取该文件,并省去使用可能存在错误的文件监视程序的需要

顺便说一句,我还没有测试过这段代码,它可能包含错误,但这个概念是正确的


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

如果您使用
require
加载设置,并且仅引用一个模块中的设置,那么请按照以下方式执行操作:

delete require.cache[require.resolve(filename)];
我会为你工作的

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

为了缓解(而不是完全解决)缓存问题,可以构建设置界面,以便其用户必须通过函数访问设置对象和/或要求通过函数访问属性。即使使用此模型,也可能有人决定缓存一个设置,导致以后出现模糊故障

对设置对象使用单个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;

有几个库可以进行设置。根据你的需要,我偏爱你

您的设置在文件中的定义方式以及在整个应用程序中的引用方式可能存在重复?