引入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
相关产品推荐
相关产品推荐

