Heroku部署NextJS+Express应用时Mongoose连接环境变量异常
问题原因
核心问题出在Next.js 14的构建静态求值机制:
- Next.js在构建时会扫描模块顶级作用域的
process.env变量,直接替换为对应值。如果Heroku构建阶段MDB_URI_AUDIO未被正确注入,这个变量会被固化为undefined,运行时自然无法获取有效连接串。 - 你的临时方案能生效,是因为本地硬编码URI执行
build时,Next.js把硬编码值写入了构建产物;改回环境变量写法部署后,若Heroku未重新构建(直接使用本地build产物),运行时实际执行的是之前硬编码的逻辑——这只是权宜之计,并非真正解决问题。
解决办法
1. 动态读取环境变量(推荐)
把环境变量的读取逻辑移到连接函数内部,避开构建阶段的静态替换:
import mongoose from "mongoose" const connectMDB = async () => { const uri = process.env.MDB_URI_AUDIO if (!uri) { throw new Error("MDB_URI_AUDIO环境变量未配置,请检查Heroku配置") } await mongoose.connect(uri) } export default connectMDB
这样无论构建阶段是否有环境变量,运行时都会从Heroku的环境变量中实时读取,彻底解决undefined问题。
2. 确认Heroku构建阶段的环境变量
默认Heroku的环境变量在构建和运行阶段都可用,若构建时仍无法获取,按以下步骤排查:
- 重新设置环境变量:执行
heroku config:set MDB_URI_AUDIO="你的MongoDB连接串",确保配置生效。 - 验证构建阶段变量:修改
package.json的build脚本,添加打印命令:
部署后查看Heroku日志,若能打印出连接串,说明构建阶段变量正常;若为空,需检查Heroku环境变量配置是否正确。"scripts": { "build": "echo \"构建阶段MDB_URI_AUDIO值:$MDB_URI_AUDIO\" && next build" }
注意事项
服务器端使用的环境变量不要加NEXT_PUBLIC_前缀,该前缀仅用于客户端组件,会把敏感信息暴露到前端。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

