Node.js动态更改导出
Node.js changing exports on the fly
更改出口。函数中的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方法。如果需要,您也可以简单地更改代码以使用同步版本,并返回值而不是调用回调。这个版本检查文件何时被更改,这比每次读取整个文件便宜,如果文件较新,则读取文件,并且节省了使用可能存在错误的文件监视器的需要。
顺便说一下,我没有测试过这段代码,它可能包含错误,但这个概念是合理的。但是,也许更重要的问题是,为什么不直接将该值存储在数据库中?
- JS动态添加字段-删除按钮不起作用
- 尝试使用Node.js动态路由从IMDB中抓取电影内容.但是在我的output.json文件中没有定义
- 使用Knockout.js动态更改facebook数据
- Three.js |动态生成BezierCurve
- 使用d3plus.js动态更改网络图表
- 如何为 Flot JS 动态创建数据集
- 角度 JS 动态选项卡字段
- 进度条.js动态设置文本
- 使用vue.js动态设置v-for
- D3.js-动态更改序数刻度
- URL重写Node js-动态URL
- 如何使用JS动态更新innerHTML
- PHP/JS:动态Dropboxes和回显SELECTED值
- 使用chart.js动态添加图表
- JSON值使用process.env[node.js]动态更新
- 如何在ng-options中添加两个索引,并使用Angular.js动态设置值
- 使用 eval() JS 动态创建对象
- D3.js动态设置节点可见性
- 挖空.js动态生成的 HTML 没有得到更新
- JS - 动态选择视频坐标