2014-01-08 73 views
4

我的Node.js應用程序與應用程序設置conf.json文件,即:如何轉換/合併node.js/nconf中的配置文件?

{ 
    "settings": [ 
    { 
     "name": "setting1", 
     "connectionString": { 
     "host": "mongodb://127.0.0.1:27017/db", 
     "collection": "collection1" 
     } 
    }, 
    { 
     "name": "setting2", 
     "file": "/path/file", 
     "token": "development token" 
    } 
    ] 
} 

有nconf中任何方式或其他工具有.NET的配置轉型的模擬,所以我可能生產配置文件與覆蓋,即conf.production.json:

{ 
    "settings": [ 
    { 
     "name": "setting2", 
     "token": "production token" 
    } 
    ] 
} 

在生產模式「設置2」的期望值是「生產標記」,並從默認的配置文件中休息。我試圖加載與nconf中的基本文件,但它不工作:

nconf.file(process.env.NODE_ENV, './conf.' + process.env.NODE_ENV + '.json'); 
nconf.file('./conf.json'); 
+0

作爲一個黑客,我可以使用像手動合併對象的東西:nconf.stores.file.store = utils.merge(nconf.stores.file.store,nconf.stores [process.env.NODE_ENV] .store); – asa

回答

1

我的配置腳本的相關部分,我個人用它來處理這個問題:

nconf 
    .argv () 
    .env () 
    .defaults(require('./_config.js')) 
    .use  ('memory') 
    ; 

... 

nconf.set('env'  , nconf.get('environments:' + env)); 
nconf.set('env:name', env); 

var includes = nconf.get('env:includes'); 

if({}.toString.call(includes) === '[object Array]'){ 
    var incs = {}; 

    includes.forEach(function(val){ 
     incs[ val ] = val; 
    }); 

    includes = incs; 
} 

Object.keys(includes).forEach(function(incName){ 
    var incPath = includes[ incName ] 
     , incData = nconf.get('environments:' + incPath); 

    Object.keys(incData).forEach(function(key){ 
     var keyNm = (incName.indexOf('__local' === 0)) 
      ? 'env:%s' .sprintf(key) 
      : 'env:%s:%s'.sprintf(incName, key) 
      ; 

     if(nconf.get(keyNm) == null){ 
      nconf.set(keyNm, incData[ key ]); 
     } 
    }); 
}); 

我認爲唯一的依賴有sprintf,您可以使用npm進行安裝,也可以稍微重新設置代碼。

基本上,我通過env帕拉姆,並設置.env該對象。然後我走一個includes對象,並從相同的配置對象中提取任何相關的JSON對象。

我然後通過config.get('env:<param>')

其中simplier config.js的訪問一切(我不喜歡.json,因爲它不能有評論)的文件,我使用:

module.exports = 

{ 
    environments : { 
     libraries : { 
      jQuery : '//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js' 
     } 

     , localLibraries : { 
      jQuery : '/js/jquery-2.1.0.js' 
     } 

     , web_server : { 
         task : 'web_server' 
      ,  includes : [ 'cdn', 'libraries' ] 

      ,   port : 12567 
      , csrfMaxAgeMs : 1000 * 60 * 60 * 24 * 30 // 30 days 
      , csrfHashAlg : 'sha256' 

      , apiHostName : '(^|\\.)api.*' 

      ,  frontend : '/frontend' 

      , jsonSpaces : 0 
     } 

     , local_web_server : { 
        task : 'web_server' 
      , includes : { __local: 'web_server', libraries: 'localLibraries' } 
      , jsonSpaces : 4 
      ,   dev : true 
     } 
    } 
}; 

要麼你有一個清單(['cdn', 'libraries']),在這種情況下,它們會映射到env.cdn.param,例如。或者你可以包含映射,如果鍵是__local,它映射到當前對象。

+0

謝謝!這說得通 – asa