将对象附加到Node.js进程
我正在使用环境variables和参数parsing模块nconf
作为我的node.js Express web服务器。
https://github.com/indexzero/nconf
我决定让nconf数据全局化的最好方法是简单地将它附加到stream程variables(如process.env中),这是个好主意还是坏主意? 它会减慢执行过程中的“过程”吗?
这是我的代码:
var nconf = require('nconf'); nconf.argv() .env() .file({ file: './config/config.json' }); nconf.defaults({ 'http': { 'port': 3000 } }); process.nconf = nconf; //now I can retrieve config settings anywhere like so process.nconf.get('key');
坦率地说,我有点像这个解决scheme。 现在我可以在任何地方检索configuration数据,而不需要一个模块。 但是这样做可能有缺点,而且这可能是一个非常糟糕的主意。 IDK。
它不会放慢执行速度,但感觉“臭”。 这很难发现,如果你决定需要的话,这将是很难testing的。
更好的解决scheme是将设置附加到模块,并使用require()将其导入到任何需要的地方。
最好的解决办法是将你的设置对象传递给需要它的类或模块。 直接或作为某种“全球背景”的一部分。
例如。
var global = { settings: { port: 8080 } } //... global.api = new Api(global); //... function Api(global) { var port = global.settings.port; }
更新:关于为什么原始模式不好的更多信息:
1)可发现性
你把你的设置附加到process.settings
并去一个不同的项目。 一年后,别人接pipe,或者你需要更新的东西。 你会记得你把你的设置连接到process.nconf
吗? 或者是process.settings
?
现在假设你有10个不同的全球性事物,以不同的名字,在不同的地方。
它不像直接连接到全局上下文那样糟糕,但是最好清楚地看看你正在使用的东西来自哪里(构造器或模块)。
2)testing
你决定你需要testing你的模块。 所以现在你需要调整每个testing的设置,而不是从文件或argv加载它们。 你是怎样做的?
如果是全局的process.nconf
或require("settings")
模式,你需要做这样的事情:
function canOpenAPIOnTheConfiguredPort(done) { var nconfSaveApiPort = process.nconf.api.port; process.nconf.api.port = '1234'; var api = new Api(); test.assertEqual(api.port, '1234'); process.nconf.api.port = nconfSaveApiPort; done(); }
随着你的应用程序的增长,这很快就会变得烦人(例如假设不得不嘲笑10件事情)。 相比之下,下面是使用dependency injection(构造函数)模式的方法。
function canOpenAPIOnTheConfiguredPort(done) { var api = new Api({ port: '1234' }); test.assertEqual(api.port, '1234'); done(); }
请注意,nconf是一个单身人士。
我用程序的开头configuration,然后当我需要在另一个文件中的设置我做:
var nconf = require ('nconf'); nconf.get('x');