Heroku部署时dotenv无法按APP_NAME加载对应.env文件如何解决
问题根因
dotenv配置的三元判断逻辑写反,直接导致配置文件加载不符合预期。
当前使用的配置代码:
dotenv.config({ path: process.env.APP_NAME !== undefined ? '.env.example' : '.env.'+process.env.APP_NAME });
这段逻辑的执行规则是:
- 当
process.env.APP_NAME存在(不等于undefined)时,加载.env.example - 当
process.env.APP_NAME不存在(等于undefined)时,才会拼接路径加载对应名称的env文件
你已经在Heroku Config Vars中设置了APP_NAME=LUIGI,部署后该变量必然存在,因此永远命中第一个分支加载.env.example,和你观测到的现象完全吻合。
本地执行heroku local web -e .env.LUIGI能得到预期效果,是因为命令中通过-e参数手动指定了要加载的env文件,直接跳过了你写的路径判断逻辑,不会触发这个逻辑错误。
修复方法
反转三元表达式的判断分支即可,修正后的代码:
dotenv.config({ path: process.env.APP_NAME ? `.env.${process.env.APP_NAME}` : '.env.example' });
修正后的执行逻辑:
- 检测到
APP_NAME环境变量存在时,拼接路径加载对应环境的配置文件,例如APP_NAME=LUIGI时自动加载.env.LUIGI - 未检测到
APP_NAME变量时,默认加载.env.example作为兜底配置
部署注意事项
- 如果你通过Git推送代码到Heroku部署,需要检查
.gitignore规则,不要把.env.LUIGI文件加入忽略列表,否则代码推送到Heroku后找不到对应配置文件,依然会加载失败。 - Heroku原生的Config Vars能力本身就是用来管理环境配置的,生产环境更推荐直接在Heroku后台配置所有环境变量,不需要依赖dotenv加载项目内的env文件,能避免配置文件遗漏、敏感信息泄露等问题。
内容的提问来源于stack exchange,提问作者monkeyUser
相关产品推荐
相关产品推荐

