部署到Heroku时.env文件中MONGO_URI配置不生效问题
问题产生原因
- 你本地的
.env文件通常会被加入.gitignore(这也是最佳实践,避免敏感的数据库凭证泄露到代码仓库),不会被推送到Heroku服务器,dotenv无法读取到不存在的文件,自然无法加载对应的环境变量 - 未在Heroku平台配置
MONGO_URI环境变量,Heroku的环境变量需要单独在平台侧配置,不会自动继承本地的配置 - dotenv加载代码的执行顺序错误:如果是在执行
mongoose.connect的代码之后才调用require('dotenv').config(),那么读取process.env.MONGO_URI的时候dotenv还没完成加载,自然拿不到值 - dotenv被安装到了开发依赖(devDependencies)中:Heroku默认部署时只会安装生产依赖(dependencies)下的包,dotenv如果在开发依赖里不会被安装,也就无法执行加载逻辑
解决办法
- 首先确认dotenv加载逻辑放在代码最顶部,早于所有引用
process.env变量的代码,正确写法示例:
// 代码第一行就加载dotenv require('dotenv').config() // 后续再写mongoose连接等业务逻辑 mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true }, () => { console.log("Connected to db successfully"); });
- 如果你只在本地开发用dotenv,可以不用把它放到生产依赖,生产环境直接走Heroku的平台环境变量配置:
- 进入你的Heroku应用后台,找到「Settings」选项卡
- 找到「Config Vars」板块,点击「Reveal Config Vars」
- 新增键为
MONGO_URI,值为你的MongoDB连接字符串mongodb+srv://test:test@cluster0.j0you.mongodb.net/ecommerce?retryWrites=true&w=majority,保存后重新部署即可
- 如果你需要生产环境也用dotenv,把dotenv从开发依赖移到生产依赖,执行
npm install dotenv --save后重新部署 - 校验排查:可以在mongoose连接前加一行打印代码
console.log('MONGO_URI:', process.env.MONGO_URI),部署后查看Heroku日志确认变量是否正确加载
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

