配置多种场景
我们的系统是要在不同的环境下运行的,不同的环境可能是不同的端口号,不同的数据库地址,数据库用户和密码,
并且可能有的需要自动重启有的不需要自动重启。
我们在有一个配置的时候是无法满足这么多的场景的,所以我们要为不同的场景做额外配置
场景的种类
场景的种类一般就以下几种
- 开发场景
- 真实场景
- 测试场景
-
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这个模块读取配置,通过不同的配置来做不同的事情, 觉得有用的大神关注相互关注下呗。