0%

2022-06-02-Nestjs中利用nestjs-config模块实现多运行环境配置

1. 问题#

在做 Nestjs 开发时,会涉及开发环境、生产环境等切换,可以通过nestjs-config进行配置文件统一管理,通过向启动命令传参的方式运行不同环境下的 Nest 应用。

2. 解决思路 1#

2.1. 使用 nest-cli 搭建脚手架#

  1. 创建项目
1
2
nest new multi-config
npm install
  1. 使用 Git 做版本管理
1
2
3
git init
git add .
git commit -m 'init'
  1. 测试脚手架
1
2
npm run start

  1. curl 127.0.01:3000

得到结果

1
Hello World!

2.2. 安装并配置 nestjs-config#

  1. 安装 nestjs-config
1
npm install --save
  1. 创建配置文件
    src/config/environment.ts,新增两个模式(此处为数据库配置,可根据业务增删)
{ join } from 'path';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
export default {
development: {
currentMode: '开发模式',
database: {
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '123456',
database: 'db',
entities: [join(__dirname, '../', '**/**.entity{.ts,.js}')],
synchronize: false, //如果为true的话,会同步数据库,不建议打开
timezone: '+08:00',
},
},
production: {
currentMode: '生产模式',
database: {
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '123456',
database: 'db',
entities: [join(__dirname, '../', '**/**.entity{.ts,.js}')],
synchronize: false, //如果为true的话,会同步数据库,不建议打开
timezone: '+08:00',
},
},
currentEnv:function(){
let ret = {};
if (!ENV) {
ret = module.exports.default.development;
} else {
ret = module.exports.default[ENV];
}
return ret;
}
};

  1. 在 Nest 应用中配置模块
    app.module.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from 'nestjs-config';
import { resolve } from 'path';

const ENV = process.env.NODE_ENV;

@Module({
imports: [
ConfigModule.load(resolve(__dirname, 'config', '**/!(*.d).{ts,js}')),],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

  1. 引用模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
import { ConfigService } from 'nestjs-config';

const ENV = process.env.NODE_ENV;
@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
private readonly config: ConfigService,
) {
let ret = this.config.get('environment.currentEnv');

console.log(ret());
}

@Get()
getHello(): string {
return this.appService.getHello();
}
}
  1. 使用指令启动不同的变量
  • npm run start
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Nest] 93694  - 2022/06/02      LOG [InstanceLoader] ConfigModule dependencies initialized +28ms
{
currentMode: '开发模式',
database: {
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '123456',
database: 'db',
synchronize: false,
timezone: '+08:00'
}
}
  • NODE_ENV=production npm run start
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Nest] 94977  - 2022/06/02      LOG [InstanceLoader] ConfigModule dependencies initialized +29ms
{
currentMode: '生产模式',
database: {
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '123456',
database: 'db',
synchronize: false,
timezone: '+08:00'
}
}

3. 解决思路 2#

将配置文件分别以文件存放,根据环境变量加载不同的配置文件,可参考如下文章:
Nest: 配置变量集,也就是全局变量

4. 引申#

nest 中文教程
nestjs-config