zoukankan      html  css  js  c++  java
  • node.js项目多环境配置

    配置多种场景

    我们的系统是要在不同的环境下运行的,不同的环境可能是不同的端口号,不同的数据库地址,数据库用户和密码,
    并且可能有的需要自动重启有的不需要自动重启。
    我们在有一个配置的时候是无法满足这么多的场景的,所以我们要为不同的场景做额外配置

    场景的种类

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

    1. 开发场景
    2. 真实场景
    3. 测试场景
    4. 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 start
    运行正常,输出正常

    npm run run

    npm run run
    运行正常,输出正常

    npm test

    npm test
    运行正常,输出正常(这里别忘了我们就是这么设置的
    “test”: “set NODE_ENV=test&&echo ”Error: no test specified” && exit 1”
    所以输出是正常的。这边的test可以之后扩展。

    配置文件的配置项目

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

  • 相关阅读:
    OCP-1Z0-051-V9.02-108题
    以一种访问权限不允许的方式做了一个访问套接字的尝试
    常用的几个官方文档
    OCP-1Z0-053-V12.02-388题
    FusionChart实现奇偶间隔显示
    OCP-1Z0-053-V12.02-138题
    Tcp and Udp NAT 穿越穿透打洞
    flashback database实验(使用lgmnr找出还原时间点)
    flashback table实验(基于undo数据)
    flashback query实验(基于undo数据)
  • 原文地址:https://www.cnblogs.com/ljx20180807/p/9766145.html
Copyright © 2011-2022 走看看