我有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');
答案 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
,它将映射到当前对象。