本地正常的后端部署到Heroku后无法运行 附代码求故障排查
Heroku部署后端失效问题排查
本地运行正常、部署到Heroku后失效,从你贴的代码看有3个必现的问题,改完就能正常运行:
1. 前端接口地址硬编码本地服务
你前端login.js的请求地址写死了本地端口:
const response = await fetch("http://localhost:5000/api/auth/login", {
本地调试时后端跑在你自己电脑的5000端口,请求自然能通。部署到Heroku后后端运行在Heroku的服务器上,前端还往你自己电脑的5000端口发请求,根本碰不到线上后端,必然失败。
修改方法
把请求地址换成你Heroku应用的分配域名,格式一般是https://你的heroku应用名.herokuapp.com。建议把接口前缀抽成全局配置,开发环境自动用本地地址,生产环境自动切线上地址,不要硬编码。
2. 数据库连接未适配线上环境
你index.js里调用了connectToMongo()连接数据库,但没贴db.js的代码,90%的概率你这里写死了本地Mongo的连接地址(比如mongodb://localhost:27017)。Heroku服务器上没有跑本地Mongo服务,连不上数据库所有接口都会报500错误。
修改方法
- 申请MongoDB Atlas免费云数据库,拿到公网可访问的连接字符串
- 把连接字符串存在环境变量里,不要硬编码在代码中,和你本地用
dotenv读.env的逻辑对齐 - 确认
db.js里的连接逻辑是读取process.env中的数据库连接串,不是写死的本地地址
3. Heroku后台未配置环境变量
你代码里用到了JWT_SECRET、数据库连接串这类环境变量,本地是靠根目录的.env文件读取,但.env文件本来就不该提交到代码仓库,Heroku部署时拿不到你本地的.env文件,如果没在后台手动配置,代码读不到对应变量直接崩溃。
修改方法
登录Heroku控制台,进入你的应用页面,在Settings - Config Vars板块,把你本地.env里的所有键值对逐一添加进去,变量名和本地保持完全一致即可。
额外注意事项
- 可以在项目根目录新建一个无后缀名的
Procfile文件,写入web: node index.js,明确告诉Heroku你的web服务启动命令,避免识别异常 - 部署前确认
.gitignore文件里包含了node_modules和.env,绝对不要把这两个文件夹/文件提交到Git仓库:前者会导致Heroku无法安装适配服务器环境的依赖,后者会泄露你的敏感信息 - 部署后如果还有问题,直接在本地终端运行
heroku logs --tail查看实时运行日志,具体报错信息会直接打在日志里,不用盲猜问题
内容的提问来源于stack exchange,提问作者Jenil Shah
相关产品推荐
相关产品推荐

