2-2 官方方案:使用config设置配置模块
NestJS 官方提供了 @nestjs/config 模块来管理应用配置,它内置了 dotenv,并在此基础上做了封装,支持全局配置、类型安全读取等功能。
安装
pnpm install @nestjs/config
bash
注意版本:如果安装的大版本号与课程不一致,可指定版本安装(如
@nestjs/config@2),以保持兼容性。
基础用法
在项目根目录创建 .env 文件:
DATABASE=mysql
DB_HOST=127.0.0.1
bash
在 app.module.ts 中注册 ConfigModule:
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot(),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
typescript
在 Controller 中通过 ConfigService 读取配置:
import { Controller, Get } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
@Controller()
export class AppController {
constructor(private configService: ConfigService) {}
@Get()
getHello(): string {
const db = this.configService.get<string>('DATABASE');
console.log(db);
return 'Hello';
}
}
typescript
全局注册(isGlobal)
默认情况下,ConfigModule 只能在声明它的模块内使用。跨模块使用时需要在每个模块单独导入,非常麻烦。
设置 isGlobal: true 后,ConfigModule 在全局可用,无需重复导入:
ConfigModule.forRoot({
isGlobal: true,
})
typescript
使用枚举管理配置键
不建议直接使用字符串读取配置,推荐使用枚举统一管理键名。当 .env 文件中的变量名变更时,只需修改枚举定义,项目中所有引用自动更新。
创建 src/enums/config.ts:
export enum ConfigEnum {
DB = 'DATABASE',
DB_HOST = 'DB_HOST',
}
typescript
使用方式:
this.configService.get<string>(ConfigEnum.DB);
this.configService.get<string>(ConfigEnum.DB_HOST);
typescript
ConfigModuleOptions 常用属性
通过查看 ConfigModuleOptions 接口定义,可以了解 forRoot() 支持的配置项:
| 属性 | 类型 | 说明 |
|---|---|---|
isGlobal | boolean | 是否全局注册 |
cache | boolean | 是否缓存配置 |
ignoreEnvFile | boolean | 是否忽略 .env 文件 |
ignoreEnvVars | boolean | 是否忽略系统环境变量 |
envFilePath | string | string | 指定 .env 文件路径 |
encoding | string | 文件编码 |
validate | function | 自定义校验函数 |
validationSchema | any | Joi 校验 Schema |
load | ConfigFactory | 加载额外配置 |
expandVariables | boolean | 是否展开变量 |
技巧:按住 Command/Ctrl 键点击方法名,可以快速查看 TypeScript 类型定义和文档注释,帮助理解各属性的作用。
↑