一般来说数据库的配置包含了一些敏感信息,不宜写在代码中提交到远程仓库,所以我们可以将配置写在配置文件中,然后提交 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的配置设置如下:
然后应用配置: