Skip to main content

Nestjs通用配置-基础进阶1

· 4 min read
Zhouxiaoxiao

开始

提示

请先阅读前序章节,本文代码依赖前序章节,Nestjs 通用配置-基础配置

在我们开发过程中一般至少会有开发环境和正式环境,两个环境的配置项虽然相同但是配置值会存在不一样,这个时候就需要我们按照不同的环境进行不同的配置。

新建配置文件

先在.env文件同级目录下新建两个文件,拷贝.env内容到两个新文件:

.env.development
.env.production

修改三个文件中的DB_NAME的值,分别添加后缀 -dev -prod

DB_NAME=mydemo-dev
DB_NAME=mydemo-prod

在启动命令中设置环境变量

我们需要增加corss-env插件,我们就可以在启动命令行上增加环境变量传递给应用程序

pnpm add cross-env -D

修改package.json,在启动命令上添加环境变量 cross-env NODE_ENV 参数

"start:dev": "cross-env NODE_ENV=development nest start --watch",
"start:debug": "nest start --debug --watch",
"start:prod": "cross-env NODE_ENV=production node dist/main",

配置文件读取

修改app.module.ts,引入环境变量,并在 ConfigModule 参数里面引入环境变量

app.module.ts
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { ConfigModule } from "@nestjs/config";

const envFilePath = `.env.${process.env.NODE_ENV || `development`}`;

@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: envFilePath,
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

接着你就可以使用不同的启动命令 pnpm start:dev 或者 pnpm start:prod ,访问 API 接口http://localhost:3000/config,就可以得到不同环境的配置信息了。

抽离公共配置项

这样的配置可以满足 90%的 Nestjs 的配置需求了,但是会存在配置项冗余的问题,比如我们的新建的两个文件里面就冗余了配置项 DB_TYPE=MYSQL, 我们的例子里面只有数据库的配置项,如果项目的配置项很多,就会冗余非常多的配置,维护起来就非常麻烦。接下来我们解决这个问题。

我们要利用之前的.env配置文件,只在.env配置文件中配置DB_TYPE=MYSQL,其余配置文件删除DB_TYPE=MYSQL配置项。

先安装插件dotenv

pnpm add dotenv

app.module.ts中修改 ConfigModule 参数,给load赋值,指定读取.env配置文件

app.module.ts
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { ConfigModule } from "@nestjs/config";
import * as dotenv from "dotenv";

const envFilePath = `.env.${process.env.NODE_ENV || `development`}`;

@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: envFilePath,
load: [() => dotenv.config({ path: ".env" })],
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

总结

我们完成了对不同环境不同配置项的读取,并且统一管理公共配置项。那么此次对配置管理就介绍完了!

源码

源码可以参考这里config-demo