1.0 前言
我们在开发过程中会有这样一类的问题,比如,本地开发连接本地的数据库,上生产环境后使用阿里云的数据库,那这些数据库的连接的配置信息是不一样的,在比如日志信息,可能本地我们需要 INFO 级别日志开调试,到了生产环境我们需要 EROR 级别的日志,每个环境不一样,那这个时候我们就需要一套环境相关的配置。
2.0 环境变量概念
Node 可以通过 process.env 来读取环境变量,比如以下代码:
// package.json"scripts": {"dev": "NODE_ENV=dev nodemon app.js","start:qa": "NODE_ENV=qa && nodemon app.js",},// app.jsconsole.log(process.env.NODE_ENV) // dev ,这样就获取到环境变量 NODE_ENV 了
执行 npm run dev 打印 dev, 执行 npm run start:qa ,打印 qa,这样我们就区分环境了
但上面代码也有个问题,如果是 window 环境下面,会直接报下面错误
因为 window 环境不支持这样设置环境变量,这个时候,如果你们开发环境,有的同事是 window,有的是 mac,就要考虑这个问题。
社区有 cross-env 支持跨平台的环境变量设置,一般我们会用这个设置,使用方式也非常简单
npm i cross-env -save-dev
安装后,我们把 package.json 改动下
// package.json"scripts": {"dev": "cross-env NODE_ENV=dev nodemon app.js","start:qa": "cross-env NODE_ENV=qa && nodemon app.js",},
这样就支持了 跨平台的环境变量设置了。
3.0 应用设置环境变量
一般而言,Web 系统开发的环境分为 “开发, 测试, 生产”三套环境, Node 中通常通过设置系统变量 NODE_ENV 来确定当前应用现在处于哪一套环境。

如上我们定义三套环境:
- base.env.js 环境通用的配置,比如 baseUrl
 - dev.env.js 开发环境配置,比如本地数据库连接地址
 - qa.env.js 测试环境配置
 - prod.env.js 生产环境配置
 
简单看看每个文件的代码:
// base.env.jsmodule.exports = {baseUrl: '',redisConfig: {port: 6379,host: '192.168.1.100',},}// dev.env.jsmodule.exports = {baseUrl: '',env: 'dev',redisConfig: {port: 6321,host: '127.0.0.1'},mySql: {port: 6379,host: '127.0.0.1',pass: 'root',userName: 'root'}}// prod.env.jsmodule.exports = {env: 'prod',}
在 index.js 我们来根据不同环境合并配置文件。
const baseConfig = require('./base.env')const envConfig = require(`./${process.env.NODE_ENV}.env`)module.exports = Object.assign(baseConfig, envConfig)
这样配置后,我们就能根据不同环境加载使用不同配置文件(后面我们在 数据库章节会用不同环境的配置连接 Mysql ),我们把配置文件绑定到 ctx 上去,这样也可以直接通过这种方式获取到配置文件。
// app.jsconst config = require('./config')app.use(async (ctx, next) => {ctx.config = configconsole.log('config:', config)await next()} )
4.0 小结
不同环境读取不同配置文件是平时开发必备的,大家可以对着 Demo 好好理解下,Demo 地址。
