Nest.js权限管理系统开发(三)环境变量与配置文件

一般来说数据库的配置包含了一些敏感信息,不宜写在代码中提交到远程仓库,所以我们可以将配置写在配置文件中,然后提交 git 时候将生产环境的配置文件其忽略。我们可以新建.env.env.prod两个文件分别存放开发与生产环境配置,也可以使用YAML等文件格式来实现自定义的配置文件。

设置环境变量

我们还安装 cross-env 来判断我们是处于什么环境:

bash 复制代码
npm install cross-env

然后修改package.json中的script:

bash 复制代码
 "start:dev": "cross-env NODE_ENV=development nest start --watch",
 "start:debug": "cross-env NODE_ENV=development nest start --debug --watch",
 "start:test": "cross-env NODE_ENV=test node dist/main",
 "start:prod": "cross-env NODE_ENV=production node dist/main",

自定义配置文件

这样生成环境的NODE_ENV 就是命令中指定的值了,我们可以根据这个加载不同配置文件。想要加载配置文件,NestJS 给我们提供了@nestjs/config,这个需要手动安装:

bash 复制代码
$ npm i --save @nestjs/config

我们创建一个config文件夹来专门存放配置文件。在其中创建不同环境对应的配置文件:

创建一个ts文件来读取和解析 YAML 文件,我们可以利用 js-yaml 包。

bash 复制代码
$ npm i js-yaml
$ npm i -D @types/js-yaml

安装包后,我们使用 yaml#load 函数加载我们刚刚在上面创建的 YAML 文件:

bash 复制代码
//config/index.ts
import { readFileSync } from 'fs'
import yaml from 'js-yaml'
import { join } from 'path'

const configFileNameObj = {
  development :'dev',
  test: 'test',
  production: 'prod',
  docker: 'docker'
}

const env = process.env.NODE_ENV as keyof typeof configFileNameObj

export default () => {
  return yaml.load(
    readFileSync(join(__dirname, `./${configFileNameObj[env]}.yml`), 'utf8')
    ) as Record<string, any>
}

在构建过程中,Nest CLI 不会自动将 "assets"(非 TS 文件)移动到 dist 文件夹。为了确保你的 YAML 文件被复制,你必须在 nest-cli.json 文件的 compilerOptions#assets 对象中指定它。例如,如果 config 文件夹与 src 文件夹处于同一级别,则添加值为 "assets": [{"include": "../config/*.yaml", "outDir": "./dist/config"}]compilerOptions#assets。我们的例子如下:

app.module.ts进行配置:

bash 复制代码
import configuration from './config/index'

// 配置模块
    ConfigModule.forRoot({
      cache: true,
      load: [configuration],
      isGlobal: true,
    }),

应用配置

现在我们来替换前面TypeOrmModule中的配置:

mysql相关配置内容如下:

app.moudle.ts中修改如下:

javascript 复制代码
// 数据库
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (config: ConfigService) => {
        return {
          type: 'mysql',
          autoLoadEntities: true,
          keepConnectionAlive: true,
          ...config.get('db.mysql'),
          // cache: {
          //   type: 'ioredis',
          //   ...config.get('redis'),
          //   alwaysEnabled: true,
          //   duration: 3 * 1000, // 缓存3s
          // },
        } as TypeOrmModuleOptions
      },
    }),

同理,我们将Redis的配置设置如下:

然后应用配置:

相关推荐
不会写DN3 小时前
Gin 日志体系详解
前端·javascript·gin
冬夜戏雪4 小时前
实习面经记录(十)
java·前端·javascript
爱学习的程序媛5 小时前
【Web前端】JavaScript设计模式全解析
前端·javascript·设计模式·web
薛先生_0995 小时前
js学习语法第一天
开发语言·javascript·学习
苦瓜小生6 小时前
【前端】|【js手撕】经典高频面试题:手写实现function.call、apply、bind
java·前端·javascript
和沐阳学逆向6 小时前
我现在怎么用 CC Switch 管中转站,顺手拿 Codex 举个例子
开发语言·javascript·ecmascript
kgduu8 小时前
js之客户端存储
javascript·数据库·oracle
四千岁8 小时前
2026 最新版:WSL + Ubuntu 全栈开发环境,一篇搞定!
javascript·node.js
竹林8189 小时前
从“连接失败”到丝滑登录:我用 ethers.js 连接 MetaMask 的完整踩坑实录
前端·javascript
铭毅天下9 小时前
EasySearch Rules 规则语法速查手册
开发语言·前端·javascript·ecmascript