您的位置:首页 > Web前端 > Node.js

node.js项目改进之环境配置

2017-04-02 21:20 567 查看

配置多种场景

我们的系统是要在不同的环境下运行的,不同的环境可能是不同的端口号,不同的数据库地址,数据库用户和密码,

并且可能有的需要自动重启有的不需要自动重启。

我们在有一个配置的时候是无法满足这么多的场景的,所以我们要为不同的场景做额外配置

场景的种类

场景的种类一般就以下几种

开发场景

真实场景

测试场景

debug场景

或者再有其他场景就做额外的添加,配制方法都是一样的

开始配置

配置环境

我们可以通过对环境的NODE_ENV赋值来区分不同的环境

我们在通过命令行在运行程序的时候对其进行赋值,不同的场景赋值不一样,在程序中读取这个值来判断是那种场景

首先我们修改package.json的script为:

"scripts": {
"start":"set NODE_ENV=production&&node bin/www",
"pm2": "pm2 start bin/www ",
"run":"set NODE_ENV=development&&nodemon bin/www",
"test": "set NODE_ENV=test&&echo \"Error: no test specified\" && exit 1"
},


(注意:我们将run 那段话的命令修改了)

这样我们在通过不同的命令启动程序的时候就NODE_ENV的值就是不同的我们就可以根据这个来设置不同的配置

配置不同的配置文件

新建文件夹config

新建三个文件

development.js

'use strict';
/**
* 开发环境配置文件
*/
var config = {
env: 'development', //环境名称
port: 3001,         //服务端口号
mysql_config: {
//mysql数据库配置
},
mongodb_config: {
//mongodb数据库配置
},
redis_config: {
//redis数据库配置
},

};
module.exports=config;


production.js

'use strict';
/**
* 生产环境配置文件
*/
var config = {
env: 'production', //环境名称
port: 3000,         //服务端口号
mysql_config: {
//mysql数据库配置
},
mongodb_config: {
//mongodb数据库配置
},
redis_config: {
//redis数据库配置
},

};
module.exports=config;


test.js

'use strict';
/**
* 测试环境配置文件
*/
var config = {
env: 'test', //环境名称
port: 3002,         //服务端口号
mysql_config: {
//mysql数据库配置
},
mongodb_config: {
//mongodb数据库配置
},
redis_config: {
//redis缓存配置
},

};
module.exports=config;


当然了配置文件的内容可以按自己的喜好随意设置。

统筹配置的文件config.js

我们需要单独写一个模块来统筹这些配置并且判断是哪种环境,并暴露对应配置。

这样我们就在app_need文件夹内新建一个文件叫config.js

'use strict';
var development=require('../config/development');
var production=require('../config/production');
var test=require('../config/test');
/**
* 判断当前指示当前环境的常量返回对应配置
* 默认返回开发环境的配置
*/
function config(){
switch(process.env.NODE_ENV){
case 'development':return development;break;
case 'production':return production;break;
case 'test':return test;break;
default:return development;
}
}
module.exports=config();


在用的到的地方调用config.js

在我们的项目没有开始写之前用到配置的地方主要就是bin/www文件了。

修改www文件

我现在的www文件是这样的

#!/usr/bin/env node

/**
* Module dependencies.
*/

var app = require('../app');
var debug = require('debug')('demo:server');
var http = require('http');

/**
* Get port from environment and store in Express.
*/

var port = normalizePort(process.env.PORT || '3000');
// app.set('port', port);

/**
* Create HTTP server.
*/

var server = http.createServer(app.callback());

/**
* Listen on provided port, on all network interfaces.
*/

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
* Normalize a port into a number, string, or false.
*/

function normalizePort(v
4000
al) {
var port = parseInt(val, 10);

if (isNaN(port)) {
// named pipe
return val;
}

if (port >= 0) {
// port number
return port;
}

return false;
}

/**
* Event listener for HTTP server "error" event.
*/

function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}

var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;

// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}

/**
* Event listener for HTTP server "listening" event.
*/

function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}


我们找到

var port = normalizePort(process.env.PORT || '3000');


这句话,就是这句话声明了端口号

我们就在这做文章

我们将其修改为:

//引入配置文件
var config = require('../app_need/config');
console.log('当前运行环境为:'+config.env);
// 将端口号设置为配置文件的端口号,默认值为3000
var port = normalizePort(config.port || '3000');
// 打印输出端口号
console.log('当前监听端口号为: ' + port);


这样我们就通过配置和启动命令的不同监听不同的端口号,我们测试一下运行不同的命令看输出

npm start



运行正常,输出正常

npm run run



运行正常,输出正常

npm test



运行正常,输出正常(这里别忘了我们就是这么设置的

“test”: “set NODE_ENV=test&&echo \”Error: no test specified\” && exit 1”



所以输出是正常的。这边的test可以之后扩展。

配置文件的配置项目

一般情况把配置文件就当全局常量用就好了,因为我们除非手动改,所有的配置一般是不会变的,然后一般情况就是配置各种开关了,数据库地址密码啦,之类的。之后如果那个模块需要用到配置了就可以调用config这个模块读取配置,通过不同的配置来做不同的事情。

最终项目地址:https://github.com/jijuxie/koa2_all.git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  node.js