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

引入dotenv后,如何区分Heroku配置变量与.env变量?

区分本地.env与Heroku环境变量的优先级规则

嘿,作为从iOS Swift转Node.js的开发者,你的这个疑问特别合理——毕竟环境变量的管理在不同平台确实有差异,我来帮你把逻辑理清楚!

首先要记住一个核心规则:dotenv默认不会覆盖process.env中已存在的变量,它只会把.env文件里的变量添加到process.env中,前提是这个变量在process.env里还不存在。

分场景看具体行为

1. 本地开发环境

当你在本地运行node app.js时:

  • 如果你的系统终端里没有手动设置过MY_SECRET_KEY(比如没执行过export MY_SECRET_KEY=xxx),那么process.env里原本没有这个变量,dotenv就会把.env文件中的12345加载进去,此时process.env.MY_SECRET_KEY就是12345。
  • 如果你本地手动设置了同名的系统环境变量,dotenv会跳过这个变量,直接使用系统已有的值,不会用.env里的内容。

2. Heroku生产环境

在Heroku上运行应用时:

  • 首先,你已经把.env加入了.gitignore,所以这个文件不会被推送到Heroku的服务器上,dotenv加载的时候找不到.env文件,自然不会添加任何变量。
  • 其次,Heroku会在应用启动前,把你通过heroku config:set设置的MY_SECRET_KEY=123456789注入到process.env中,所以此时process.env.MY_SECRET_KEY就是Heroku设置的这个值。
  • 退一万步说,就算你不小心把.env部署到了Heroku,因为Heroku已经在process.env里设置了同名变量,dotenv默认也不会覆盖它,最终还是会用Heroku的配置值。

对你代码疑问的解答

你担心的这种情况:

const dotenv = require('dotenv');
dotenv.load();
var isThisAHerokuKey = process.env.MY_SECRET_KEY // key is 123456789
var orIsThisADotEnvKey = process.env.MY_SECRET_KEY // key is 12345
initializeSomethingWith(process.env.MY_SECRET_KEY) // which key is this using?

实际上是不会出现的——process.env里的同一个变量只会有一个值:

  • 如果是在Heroku上运行,值就是123456789;
  • 如果是本地运行且没有设置系统环境变量,值就是12345。

额外小提示

现在dotenv官方推荐用dotenv.config()代替旧的dotenv.load(),功能是一样的。如果你特殊场景下需要让dotenv强制覆盖已存在的变量,可以这么写:

dotenv.config({ override: true });

但一般不建议这么做,尤其是在生产环境,会导致Heroku的配置被本地.env文件覆盖,引发问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:31:34