2012-10-05 96 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

相關問題