将对象附加到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.nconfrequire("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');