主题
加载环境变量
NestJS 核心不会自动读取项目中的 .env 文件。操作系统、Shell、容器或部署平台注入的环境变量可以直接通过 process.env 访问;.env 文件需要由 @nestjs/config、Node.js 或其他加载器显式加载。
使用 ConfigModule
安装 @nestjs/config:
bash
pnpm add @nestjs/config在根模块中调用 ConfigModule.forRoot()。默认读取应用根目录下的 .env 文件,并将其中的配置与 process.env 合并:
ts
import { Module } from '@nestjs/common'
import { ConfigModule } from '@nestjs/config'
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
}),
],
})
export class AppModule {}当同名变量同时存在于运行环境和 .env 文件中时,运行环境中的值优先。isGlobal: true 使其他模块无需重复导入 ConfigModule;也可以不启用全局模式,在需要配置的模块中显式导入。
读取变量
通过 ConfigService 读取配置,可以声明预期的返回类型:
ts
import { Injectable } from '@nestjs/common'
import { ConfigService } from '@nestjs/config'
@Injectable()
export class AppService {
constructor(private readonly configService: ConfigService) {}
getDatabaseUrl() {
return this.configService.getOrThrow<string>('DATABASE_URL')
}
}get() 在变量不存在时返回 undefined;必需配置使用 getOrThrow(),避免应用在缺少配置时继续运行。完成加载后也可以通过 process.env.DATABASE_URL 读取,但 ConfigService 更适合结合依赖注入、类型声明与配置校验。
指定环境文件
通过 envFilePath 指定一个或多个环境文件:
ts
ConfigModule.forRoot({
envFilePath: ['.env.local', '.env'],
isGlobal: true,
})数组中先出现的文件优先级更高。环境文件通常包含数据库密码、密钥等敏感信息,不应提交到 Git。
在 Nest 应用初始化前加载
模块文件顶层代码会在 ConfigModule 初始化前执行。若创建 Nest 应用或微服务之前就需要读取 .env,可以由 Nest CLI 交给 Node.js 提前加载:
bash
nest start --env-file .env此时变量在应用引导前已经写入 process.env。
