1. 问题
在做 Nestjs 开发时,会涉及开发环境、生产环境等切换,可以通过nestjs-config进行配置文件统一管理,通过向启动命令传参的方式运行不同环境下的 Nest 应用。
2. 解决思路 1
2.1. 使用 nest-cli 搭建脚手架
- 创建项目
nest new multi-config
npm install
- 使用 Git 做版本管理
git init
git add .
git commit -m 'init'
- 测试脚手架
npm run start
- curl 127.0.01:3000
得到结果
Hello World!
2.2. 安装并配置 nestjs-config
- 安装 nestjs-config
npm install --save
- 创建配置文件
src/config/environment.ts,新增两个模式(此处为数据库配置,可根据业务增删)
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;
}
};
- 在 Nest 应用中配置模块
app.module.ts
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 {}
- 引用模块
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();
}
}
- 使用指令启动不同的变量
- npm run start
[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
[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: 配置变量集,也就是全局变量