Skip to content

加载环境变量

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

参考

基于 MIT 许可发布