本文使用的配置管理方案来自于MEAN Web开发一书

我们开发的程序往往会运行在不同的环境中,例如开发,测试,生产等,比如开发时连接到的数据库里面的数据是模拟出来的,而生产环境要连接到实际的数据库上,测试的时候可能需要另一个数据库,因此我们需要让程序能根据不同的运行环境来载入不同的配置文件。

另外,我们使用的第三方模块也很可能需要配置文件,将这些配置文件集中起来进行管理,这样在环境变化或模块配置变化的时候我们就不需要改动源代码,配置与使用分离。

本文使用js文件作为配置文件格式,其他常见的格式还有json,yaml等,另外也可以使用config模块进行配置管理,详细的请查阅Node.js 项目的配置文件

使用本文的配置管理方案后结缘的config文件结构类似如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
$ tree config
config
├── config.js
├── env
│   ├── development.js
│   ├── production.js
│   └── test.js
├── mongoose.js
├── passport.js
└── strategies
├── bearer.js
└── local.js

环境配置

首先在config文件夹下创建env文件夹以及development.jstest.jsproduction.js,分别用于开发,测试,生产环境下.

1
$ mkdir env && cd $_ && touch development.js test.js production.js

写入部分配置项,如development.js:

1
2
3
4
module.exports = {
sessionSecret : 'developmentSessionSecret',
db: 'mongodb://localhost/test'
}

test.jsproduction.js中可以写入不同的db.然后创建config.js文件,写入以下代码:

1
module.exports = require('./env/' + process.env.NODE_ENV + '.js');

这句代码会根据当前的NODE_ENV加载合适的配置文件,node默认情况下为development模式,我们可以设置NODE_ENV环境变量或在运行node前指定环境变量。

1
$ NODE_ENV=test PORT=9807 node ...

在需要用到环境设置的时候引入config.js文件即可,如:

1
var config = require('./config')

模块配置

可以将第三方模块的配置也放到config中来统一管理,以mongoose为例,在config文件夹下创建mongoose.js文件,写入如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var config = require('./config'),
mongoose = require('mongoose');
module.exports = function(){
var db = mongoose.connect(config.db,function(err) {
if(err) {
console.log('connection error', err);
} else {
console.log('connection successful : ' + config.db);
}
});
return db;
};

引入配置信息,读取db,然后使用mongoose连接,导出该函数,然后在需要链接数据库的时候使用:

1
2
var Mongoose = require('../config/mongoose');
var db = Mongoose();

进行数据库连接.