NestJS 下配置信息与环境变量
参考文章 []
1.背景
项目目前是一套, 配置化写死的, 由于做的一个日志系统导致现在有些问题,需要配置信息代码化.总而言之,需要进行整合获取不同的配置.
获取配置的方式:
- 硬代码,直接写死。- ❌ 可维护性低
- 写死在ts文件,例如config/app.ts中。 - ❌ 无法区分环境进行配置
- 直接读取.env文件。 - ❌ 虽然解决了环境变量问题但是不推荐
- 环境变量存储在 .env中,配置信息保存在ts文件中,然后使用 config.get() 函数来读取。- ✅ 最佳实践
2.设计方式
所有程序配置信息 必须 通过 config.get() 来读取,绝不在配置文件以外的范围读取环境变量。
- 定义分明,config.get() 读取的是配置信息。.env 文件保存的是环境变量,在不同环境下可以配置不同的内容。
- 代码健壮性, config.get() 在 .env 文件之上多出来一个抽象层,会使代码更加健壮,更加灵活。
3.应用
使用 process.env
参考文章: []
process对象是全局变量,它提供当前node.js的有关信息,以及控制当前node.js的有关进程。因为是全局变量,它对于node应用程序是始终可用的,无需require()。
既然process都是一个对象了,env自然是它的一个属性,这个属性返回包含用户环境信息的对象。在终端输入node后,在输入process.env可以看到打印出来的信息。
设置NODE_ENV
NODE_ENV不是process.env对象上原有的属性,它是我们自己添加上去的一个环境变量,用来确定当前所处的开发阶段。一般生产阶段设为production,开发阶段设为develop,然后在脚本中读取process.env.NODE_ENV。
运行脚本时,可以这样改变环境变量, 在package.json文件的scripts里面添加命令:
windows: set NODE_ENV=production node build.js
linux: NODE_ENV=production node build.js
但是windows与linux上设置命令不一致, 使用跨平台设置 cross-env
使用 cross-env
安装
官网: https://www.npmjs.com/package/cross-env
npm install --save-dev cross-env
建立config文件夹
建立config文件夹与其中的 ts 配置文件
使用示例
在package.json文件中 配置script脚本命令即可
cross-env NODE_ENV=development
"scripts": {
"start:dev": "cross-env NODE_ENV=development nest start --watch ",
"start:debug": "nest start --debug --watch",
"start:prod": "cross-env NODE_ENV=production node dist/main"}
代码
index.ts
import * as dev from './env.dev';
import * as prop from './env.prod';
const envconfigs = {
development: dev,
production: prop,
};
// const env = process.env.NODE_ENV || 'development';
const environment = envconfigs[process.env.NODE_ENV || 'development']
export { environment };
env.dev.ts
import { DbLogger } from 'src/utils/log4js';
import { ConnectionOptions } from 'typeorm';
export const db: ConnectionOptions = {
"name": "default",
"type": "mysql",
"host": "127.0.0.1",
"port": 3306,
"username": "root",
"password": "",
"database": "test",
"entities": [
"dist/**/*.entity{.ts,.js}"
],
"synchronize": true,
"logging": "all",
"maxQueryExecutionTime": 1000,
"logger": new DbLogger()
}
env.prod.ts
import { ConnectionOptions } from 'typeorm';
export const db: ConnectionOptions = {
type: 'mysql',
host: "线上",
port: 3306,
username: 'root',
password: '线上的',
database: 'test',
logging: true,
timezone: '+08:00',
dateStrings: true,
entities: ['src/**/*.entity.js']
};