【NestJS】配置信息与环境变量

NestJS 下配置信息与环境变量

参考文章 [https://juejin.cn/post/6844903879646117901]

1.背景

项目目前是一套, 配置化写死的, 由于做的一个日志系统导致现在有些问题,需要配置信息代码化.总而言之,需要进行整合获取不同的配置.
获取配置的方式:
	- 硬代码,直接写死。- ❌ 可维护性低
	- 写死在ts文件,例如config/app.ts中。 - ❌ 无法区分环境进行配置
	- 直接读取.env文件。 - ❌ 虽然解决了环境变量问题但是不推荐
	- 环境变量存储在 .env中,配置信息保存在ts文件中,然后使用 config.get() 函数来读取。- ✅ 最佳实践

2.设计方式

所有程序配置信息 必须 通过 config.get() 来读取,绝不在配置文件以外的范围读取环境变量。
    - 定义分明,config.get() 读取的是配置信息。.env 文件保存的是环境变量,在不同环境下可以配置不同的内容。
    - 代码健壮性, config.get() 在 .env 文件之上多出来一个抽象层,会使代码更加健壮,更加灵活。

3.应用

使用 process.env

参考文章: [https://blog.csdn.net/xiaolinlife/article/details/107032533]
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']
};
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值