如何在node.js / nconf中转换/合并配置文件?

时间:2014-01-08 11:11:08

标签: json node.js config

我有node.js app和conf.json文件,其中包含应用程序设置,即:

{
  "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"
    }
  ]
}

生产模式中“setting2”的预期值是“生产令牌”,并从默认配置文件中休息。我试图用nconf加载基本文件,但它不起作用:

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

1 个答案:

答案 0 :(得分:2)

我个人用来处理此配置脚本的相关部分:

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 param,并将.env设置为该对象。然后我走一个includes对象,并从同一个配置对象中提取任何相关的JSON对象。

然后我通过config.get( 'env:<param>' )

访问所有内容

我使用的一个简单的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,它将映射到当前对象。