配置多种场景
我们的系统是要在不同的环境下运行的,不同的环境可能是不同的端口号,不同的数据库地址,数据库用户和密码,
并且可能有的需要自动重启有的不需要自动重启。
我们在有一个配置的时候是无法满足这么多的场景的,所以我们要为不同的场景做额外配置
场景的种类
场景的种类一般就以下几种
- 开发场景
- 真实场景
- 测试场景
- debug场景
或者再有其他场景就做额外的添加,配制方法都是一样的
开始配置
配置环境
我们可以通过对环境的NODE_ENV赋值来区分不同的环境
我们在通过命令行在运行程序的时候对其进行赋值,不同的场景赋值不一样,在程序中读取这个值来判断是那种场景
首先我们修改package.json的script为:
1 "scripts": {
2 "start":"set NODE_ENV=production&&node bin/www",
3 "pm2": "pm2 start bin/www ",
4 "run":"set NODE_ENV=development&&nodemon bin/www",
5 "test": "set NODE_ENV=test&&echo \"Error: no test specified\" && exit 1"
6 },
(注意:我们将run 那段话的命令修改了)
这样我们在通过不同的命令启动程序的时候就NODE_ENV的值就是不同的我们就可以根据这个来设置不同的配置
配置不同的配置文件
新建文件夹config
新建三个文件
development.js
1 'use strict';
2 /**
3 * 开发环境配置文件
4 */
5 var config = {
6 env: 'development', //环境名称
7 port: 3001, //服务端口号
8 mysql_config: {
9 //mysql数据库配置
10 },
11 mongodb_config: {
12 //mongodb数据库配置
13 },
14 redis_config: {
15 //redis数据库配置
16 },
17 };
18 module.exports=config;
production.js
1 'use strict';
2 /**
3 * 生产环境配置文件
4 */
5 var config = {
6 env: 'production', //环境名称
7 port: 3000, //服务端口号
8 mysql_config: {
9 //mysql数据库配置
10 },
11 mongodb_config: {
12 //mongodb数据库配置
13 },
14 redis_config: {
15 //redis数据库配置
16 },
17
18 };
19 module.exports=config;
test.js
1 'use strict';
2 /**
3 * 测试环境配置文件
4 */
5 var config = {
6 env: 'test', //环境名称
7 port: 3002, //服务端口号
8 mysql_config: {
9 //mysql数据库配置
10 },
11 mongodb_config: {
12 //mongodb数据库配置
13 },
14 redis_config: {
15 //redis缓存配置
16 },
17 };
18 module.exports=config;
当然了配置文件的内容可以按自己的喜好随意设置。
统筹配置的文件config.js
我们需要单独写一个模块来统筹这些配置并且判断是哪种环境,并暴露对应配置。
这样我们就在app_need文件夹内新建一个文件叫config.js
1 #!/usr/bin/env node
2 /**
3 * Module dependencies.
4 */
5 var app = require('../app');
6 var debug = require('debug')('demo:server');
7 var http = require('http');
8 /**
9 * Get port from environment and store in Express.
10 */
11 var port = normalizePort(process.env.PORT || '3000');
12 // app.set('port', port);
13
14 /**
15 * Create HTTP server.
16 */
17 var server = http.createServer(app.callback());
18 /**
19 * Listen on provided port, on all network interfaces.
20 */
21 server.listen(port);
22 server.on('error', onError);
23 server.on('listening', onListening);
24
25 /**
26 * Normalize a port into a number, string, or false.
27 */
28 function normalizePort(val) {
29 var port = parseInt(val, 10);
30
31 if (isNaN(port)) {
32 // named pipe
33 return val;
34 }
35 if (port >= 0) {
36 // port number
37 return port;
38 }
39 return false;
40 }
41
42 /**
43 * Event listener for HTTP server "error" event.
44 */
45 function onError(error) {
46 if (error.syscall !== 'listen') {
47 throw error;
48 }
49 var bind = typeof port === 'string'
50 ? 'Pipe ' + port
51 : 'Port ' + port;
52
53 // handle specific listen errors with friendly messages
54 switch (error.code) {
55 case 'EACCES':
56 console.error(bind + ' requires elevated privileges');
57 process.exit(1);
58 break;
59 case 'EADDRINUSE':
60 console.error(bind + ' is already in use');
61 process.exit(1);
62 break;
63 default:
64 throw error;
65 }
66 }
67 /**
68 * Event listener for HTTP server "listening" event.
69 */
70
71 function onListening() {
72 var addr = server.address();
73 var bind = typeof addr === 'string'
74 ? 'pipe ' + addr
75 : 'port ' + addr.port;
76 debug('Listening on ' + bind);
77 }
我们找到
1 var port = normalizePort(process.env.PORT || '3000');
这句话,就是这句话声明了端口号
我们就在这做文章
我们将其修改为:
1 //引入配置文件
2 var config = require('../app_need/config');
3 console.log('当前运行环境为:'+config.env);
4 // 将端口号设置为配置文件的端口号,默认值为3000
5 var port = normalizePort(config.port || '3000');
6 // 打印输出端口号
7 console.log('当前监听端口号为: ' + port);
这样我们就通过配置和启动命令的不同监听不同的端口号,我们测试一下运行不同的命令看输出
npm start
运行正常,输出正常
npm run run
运行正常,输出正常
npm test
运行正常,输出正常(这里别忘了我们就是这么设置的
“test”: “set NODE_ENV=test&&echo \”Error: no test specified\” && exit 1”
所以输出是正常的。这边的test可以之后扩展。
配置文件的配置项目
一般情况把配置文件就当全局常量用就好了,因为我们除非手动改,所有的配置一般是不会变的,然后一般情况就是配置各种开关了,数据库地址密码啦,之类的。之后如果那个模块需要用到配置了就可以调用config这个模块读取配置,通过不同的配置来做不同的事情