2012-10-05 60 views
2

我有一个config.js,它具有我所有的变量设置。基于环境的express/node应用程序覆盖config.js变量

我想创建一个config.global.js并让config.production.js覆盖其中的一些,而config.development.js覆盖其中的一些。

下面是一个例子config.development.js:

var config = {};  

config.env = 'development'; 
config.hostname = 'example.dev'; 
config.appname = 'Example.com'; 
config.site_url = 'http://example.dev:8080'; 

module.exports = config; 

我想我可以做到这一点的config.development.js(和config.production.js)覆盖:

var config = require('config.global.js'); 

config.env = 'development'; 
config.hostname = 'example.dev'; 
config.appname = 'Example.com'; 
config.site_url = 'http://example.dev:8080'; 

module.exports = config; 

然后在app.js,我可以这样做:

var cfg = require('config.' + (process.ENV.APP_ENV || 'development') + '.js'); 
app.set('domain', cfg.hostname); 

还有其他的方法来定义应用程序配置变量?

+0

通常环境变量是'NODE_ENV'。除此之外,这似乎很好。另外,如果变量全部为大写,并且你处于一个case-in()灵敏操作系统中(Mac OS vs linux),那么我会使用'lowercase()'变量来表示变量。 –

+0

哪个变量你会小写? NODE_ENV? – chovy

+0

'process.ENV.NODE_ENV.lowercase()'。顺便说一句,如果我记得正确表达有一些帮助环境变量。 –

回答

3

为什么不使用一个JSON文件设置所有环境。当您引入更多环境时,您的方法可能无法很好地扩展。您可以通过查找NODE_ENV属性并使用它从您的环境中选择一组属性来获取正确的一组属性。

我前段时间在Bootstraping a Node.js App for Dev/Prod Environment的博客上发过帖子。具体阅读“模拟测试过程中的生产环境”,了解如何做到这一点。

+0

我认为我的方法实际上非常好。我只覆盖config.global.js中的任何内容。你为什么说它不能缩放? – chovy

+0

在你的方法中,你已经提到了三个文件'config.global.js','config.development.js'和'config.production.js'。 使用这种方法当你添加诸如'staging','qa'等新环境时,你将不得不创建新的js文件。如果将所有属性存储在JSON文件中,则所有内容都将合并到一个位置而不是多个文件中。如果你想要一些默认属性,那么你可以在JSON文件中添加一个默认部分。现在编写一个帮助函数来返回env。具体的价值。如果没有env。特定值存在但缺省值返回。 – himanshu

+0

我明白你的观点。如果你有更多的环境,它可以增加文件的数量。不知道我将如何具体化一个全局并覆盖一个文件。 – chovy

2

如果按照人士Himanshu的意见,并使用一个配置文件,您可以使用原型继承,以避免重复:

var config = {};  

config.base = {}; 
config.base.env = 'development'; 
config.base.hostname = 'example.dev'; 
config.base.appname = 'Example.com'; 
config.base.site_url = 'http://example.dev:8080'; 

config.development = Object.create(config.base); 
config.development.debugLevel = 'high'; 
... 

config.production = Object.create(config.base); 
config.production.debugLevel = 'low'; 
... 

module.exports = config; 

Object.create()是ES5函数创建一个具有指定原型一个新的空对象。

+0

我如何在环境中使用它?我希望能够执行require('./ config')。hostname并获取dev或prod主机名。 – chovy

+0

类似于'var cfg = require('./ config')[process.ENV.APP_ENV || '发展'];' – ebohlman

+0

这是一种烦人的做法,无论我需要cfg.whatever。不过谢谢,我会考虑这个。也许自动加载封装。 – chovy

相关问题