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.js
console.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.js
module.exports = {
baseUrl: '',
redisConfig: {
port: 6379,
host: '192.168.1.100',
},
}
// dev.env.js
module.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.js
module.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.js
const config = require('./config')
app.use(async (ctx, next) => {
ctx.config = config
console.log('config:', config)
await next()
} )
4.0 小结
不同环境读取不同配置文件是平时开发必备的,大家可以对着 Demo 好好理解下,Demo 地址。