基于环境覆盖express / node app的config.js变量

时间:2012-10-05 08:48:23

标签: node.js configuration express

我有一个config.js,它设置了所有变量。

我想创建一个config.global.js并让config.production.js覆盖其中的一些,con​​fig.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);

有哪些其他方法可以定义应用程序配置变量?

2 个答案:

答案 0 :(得分:3)

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

我之前在Bootstraping a Node.js App for Dev/Prod Environment写了一篇关于它的博客。具体请参阅“在测试期间模拟生产环境”,以获取如何执行此操作的示例。

答案 1 :(得分: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函数,它使用指定的原型创建一个新的空对象。