我有node.js应用程序和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"
}
]
}
生产模式下"set2"的预期值是"生产令牌",其余值来自默认配置文件。我尝试使用 nconf 加载基本文件,但它不起作用:
nconf.file(process.env.NODE_ENV, './conf.' + process.env.NODE_ENV + '.json');
nconf.file('./conf.json');
我个人用来处理这个问题的配置脚本的相关部分:
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>' )
访问所有内容
我使用的更简单的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
,它将映射到当前对象。