You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS主模块中process.env.NODE_ENV变量为何未定义?

问题原因

核心在于代码执行时机的差异:

  • AppModule中ConfigModule.forRoot()的参数(包括envFilePath的字符串拼接)是在模块被Node.js加载时就执行的,这个时机早于bootstrap()函数的调用。
  • 如果你是在bootstrap()函数内部设置process.env.NODE_ENV,或者虽然通过启动命令设置,但字符串拼接的计算时机过早,都会导致模块中读取到的process.env.NODE_ENV为undefined。
  • 而bootstrap()中的console.log是在函数运行时执行,此时process.env.NODE_ENV已经被正确设置,所以能输出dev。
解决方案

方案1:延迟envFilePath的计算时机

将envFilePath改为函数形式,让它在ConfigModule初始化阶段(而非模块加载阶段)执行,此时process.env.NODE_ENV已经可用:

// app.module.ts
ConfigModule.forRoot({
  envFilePath: () => `src/config/env/${process.env.NODE_ENV || 'dev'}.env`, // 用函数延迟计算
  isGlobal: true,
  load: [configuration],
}),

方案2:在模块加载前设置NODE_ENV

如果是手动设置环境变量,把设置代码移到main.ts的顶层,在导入AppModule之前执行:

// main.ts
// 先设置环境变量,确保模块加载时已存在
process.env.NODE_ENV = process.env.NODE_ENV || 'dev';

import { AppModule } from './app.module';
import { NestFactory } from '@nestjs/core';

async function bootstrap() {
  console.log('ENV', process.env.NODE_ENV);
  const app = await NestFactory.create(AppModule);
  // ...
}

bootstrap();

方案3:通过启动命令明确设置NODE_ENV

如果是用启动命令传递环境变量,确保命令正确设置,比如使用cross-env兼容多平台:

# package.json
"scripts": {
  "start:dev": "cross-env NODE_ENV=dev nest start"
}

这种方式设置的process.env.NODE_ENV是进程级的,会在模块加载时就存在,此时直接用字符串拼接也能正常工作。

内容的提问来源于stack exchange,提问作者lalilulelo_1986

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:05:06