一般来说数据库的配置包含了一些敏感信息,不宜写在代码中提交到远程仓库,所以我们可以将配置写在配置文件中,然后提交 git 时候将生产环境的配置文件其忽略。我们可以新建.env
和.env.prod
两个文件分别存放开发与生产环境配置,也可以使用YAML等文件格式来实现自定义的配置文件。
设置环境变量
我们还安装 cross-env
来判断我们是处于什么环境:
npm install cross-env
然后修改package.json
中的script:
"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
,这个需要手动安装:
$ npm i --save @nestjs/config
我们创建一个config文件夹来专门存放配置文件。在其中创建不同环境对应的配置文件:
创建一个ts文件来读取和解析 YAML 文件,我们可以利用 js-yaml
包。
$ npm i js-yaml
$ npm i -D @types/js-yaml
安装包后,我们使用 yaml#load
函数加载我们刚刚在上面创建的 YAML 文件:
//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 configFileNameObjexport 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
进行配置:
import configuration from './config/index'// 配置模块ConfigModule.forRoot({cache: true,load: [configuration],isGlobal: true,}),
应用配置
现在我们来替换前面TypeOrmModule中的配置:
mysql相关配置内容如下:
app.moudle.ts中修改如下:
// 数据库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的配置设置如下:
然后应用配置: