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

配置.env并使用dotenv时NODE_ENV被错误识别为production的问题

根本原因

1. dotenv 的默认加载优先级规则

dotenv 默认不会覆盖当前进程上下文中已经存在的环境变量:

  • 只有当 process.env 里不存在同名变量时,dotenv 才会把 .env 文件里的配置写入进程环境
  • 如果进程启动时就已经有同名的环境变量值,dotenv 会直接跳过该条配置,不会用 .env 里的内容替换

你现在遇到的 nodeEnv 被识别为 production 的现象,本质就是这个规则触发的结果:在 server.js 执行到 require('dotenv').config() 这行代码之前,当前运行进程的环境里已经被提前注入了值为 production 的 NODE_ENV,所以 .env 里写的 development 根本没有生效入口。

2. 为什么 Node 交互终端里查到的值是正常的

你手动打开 Node 交互终端、和实际运行 server.js 的进程,不属于同一个运行上下文:

  • 你启动 Node 交互终端时,用的是当前 shell 会话的环境配置,此时 NODE_ENV 的取值是 development,所以交互终端里读取到的变量完全符合预期
  • 但实际运行 server.js 的启动链路,可能在 dotenv 加载前就已经注入了 NODE_ENV=production:常见的注入位置包括 package.json 的启动脚本里通过 cross-env 提前赋值、你用到的 Heroku 这类云托管平台的内置默认环境变量配置、全局 shell 配置里针对特定启动命令的变量覆盖,这些注入动作都发生在 dotenv 执行加载逻辑之前。

3. 快速验证方法

直接在 server.js 里的 dotenv 加载语句前后加打印逻辑,代码放在文件最顶部即可:

// 这行写在dotenv引入代码的前面
console.log('dotenv加载前的NODE_ENV:', process.env.NODE_ENV)
require('dotenv').config()
console.log('dotenv加载后的NODE_ENV:', process.env.NODE_ENV)

如果第一行打印出来的值就是 production,就可以完全确认是 dotenv 加载前的前置环境变量覆盖问题。

如果确实需要强制用 .env 里的配置覆盖已存在的环境变量,可以给 dotenv 传入 override 参数:

require('dotenv').config({ override: true })

注意不建议在生产环境开启这个配置,容易打乱平台默认的环境变量优先级,引发不可预期的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 22:45:02