1.0 前言

我们在开发过程中会有这样一类的问题,比如,本地开发连接本地的数据库,上生产环境后使用阿里云的数据库,那这些数据库的连接的配置信息是不一样的,在比如日志信息,可能本地我们需要 INFO 级别日志开调试,到了生产环境我们需要 EROR 级别的日志,每个环境不一样,那这个时候我们就需要一套环境相关的配置。

2.0 环境变量概念

Node 可以通过 process.env 来读取环境变量,比如以下代码:

  1. // package.json
  2. "scripts": {
  3. "dev": "NODE_ENV=dev nodemon app.js",
  4. "start:qa": "NODE_ENV=qa && nodemon app.js",
  5. },
  6. // app.js
  7. console.log(process.env.NODE_ENV) // dev ,这样就获取到环境变量 NODE_ENV 了

执行 npm run dev 打印 dev, 执行 npm run start:qa ,打印 qa,这样我们就区分环境了

但上面代码也有个问题,如果是 window 环境下面,会直接报下面错误
image.png
因为 window 环境不支持这样设置环境变量,这个时候,如果你们开发环境,有的同事是 window,有的是 mac,就要考虑这个问题。
社区有 cross-env 支持跨平台的环境变量设置,一般我们会用这个设置,使用方式也非常简单

  1. npm i cross-env -save-dev

安装后,我们把 package.json 改动下

  1. // package.json
  2. "scripts": {
  3. "dev": "cross-env NODE_ENV=dev nodemon app.js",
  4. "start:qa": "cross-env NODE_ENV=qa && nodemon app.js",
  5. },

这样就支持了 跨平台的环境变量设置了。

3.0 应用设置环境变量

一般而言,Web 系统开发的环境分为 “开发, 测试, 生产”三套环境, Node 中通常通过设置系统变量 NODE_ENV 来确定当前应用现在处于哪一套环境。

image.png
如上我们定义三套环境:

  • base.env.js 环境通用的配置,比如 baseUrl
  • dev.env.js 开发环境配置,比如本地数据库连接地址
  • qa.env.js 测试环境配置
  • prod.env.js 生产环境配置

简单看看每个文件的代码:

  1. // base.env.js
  2. module.exports = {
  3. baseUrl: '',
  4. redisConfig: {
  5. port: 6379,
  6. host: '192.168.1.100',
  7. },
  8. }
  9. // dev.env.js
  10. module.exports = {
  11. baseUrl: '',
  12. env: 'dev',
  13. redisConfig: {
  14. port: 6321,
  15. host: '127.0.0.1'
  16. },
  17. mySql: {
  18. port: 6379,
  19. host: '127.0.0.1',
  20. pass: 'root',
  21. userName: 'root'
  22. }
  23. }
  24. // prod.env.js
  25. module.exports = {
  26. env: 'prod',
  27. }

在 index.js 我们来根据不同环境合并配置文件。

  1. const baseConfig = require('./base.env')
  2. const envConfig = require(`./${process.env.NODE_ENV}.env`)
  3. module.exports = Object.assign(baseConfig, envConfig)

这样配置后,我们就能根据不同环境加载使用不同配置文件(后面我们在 数据库章节会用不同环境的配置连接 Mysql ),我们把配置文件绑定到 ctx 上去,这样也可以直接通过这种方式获取到配置文件。

  1. // app.js
  2. const config = require('./config')
  3. app.use(async (ctx, next) => {
  4. ctx.config = config
  5. console.log('config:', config)
  6. await next()
  7. } )

4.0 小结

不同环境读取不同配置文件是平时开发必备的,大家可以对着 Demo 好好理解下,Demo 地址