2

我有一个 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);

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

4

2 回答 2

3

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

前段时间,我在Bootstraping a Node.js App for Dev/Prod Environment中写了一篇关于它的博客。具体操作方法请阅读“在测试期间模拟生产环境”的示例。

于 2012-10-05T19:11:41.533 回答
2

如果您遵循 hemanshu 的建议并使用单个配置文件,则可以使用原型继承来避免重复:

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

于 2012-10-06T02:18:51.463 回答