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的配置设置如下:

然后应用配置:

相关推荐
菜鸟小码15 小时前
MapReduce 核心思想:分而治之,大数据处理的智慧之源
前端·javascript·mapreduce
凤头百灵鸟16 小时前
Python语法进阶篇 --- 单例模式、魔法方法
javascript·python·单例模式
一袋米扛几楼9816 小时前
【前端开发】基于TypeScript打破 React 黑盒——组件的“工厂心智模型”与源码解剖
javascript·react.js·typescript
菜鸟小码17 小时前
MapReduce 核心阶段深度解析:Map 阶段与 Reduce 阶段的作用及执行流程
前端·javascript·mapreduce
@大迁世界17 小时前
33.如何在 React 中使用内联样式(inline styles)?
前端·javascript·react.js·前端框架·ecmascript
费曼学习法17 小时前
快速选择算法:如何在 10 亿数据中瞬间找到“第 K 大”?
javascript·算法
用户9623779544817 小时前
原理分析 | Controller —— SpringBoot 内存马
javascript·后端
写代码的皮筏艇17 小时前
replace方法
前端·javascript
李李李勃谦18 小时前
Vue3 + Electron + OpenHarmony 跨平台实战:从架构设计到 Markdown 编辑器完整实现
javascript·华为·electron·编辑器·harmonyos
Highcharts.js18 小时前
实战指南:如何构建一套全平台适配的响应式图表系统?
前端·javascript·highcharts·实战代码·响应式图表