部署到Heroku后axios Catch块失效,本地正常仅错误登录触发H12错误
问题根因
Heroku的H12错误是请求超时错误:平台要求所有请求必须在30秒内返回响应,超时就会主动断开连接,返回你看到的503错误页面,这就是你前端拿到HTML而不是预期JSON的原因。
你登录成功时逻辑正常,直接返回响应,不会触发问题;只有登录失败时,你通过next(AppError)将错误抛给全局错误处理中间件globalErrorHandler,问题就出在这个你没贴出代码的中间件上:
- 大概率是该中间件内部存在阻塞逻辑,比如错误上报、告警邮件发送、第三方日志写入等操作,在Heroku环境下因为缺少环境变量、网络不通等原因卡住,一直没有返回响应,导致请求超时
- 本地运行没有30秒的超时限制,就算逻辑卡住最终也能返回,所以本地复现不了问题
解决步骤
- 优先排查
globalErrorHandler代码,确保所有逻辑分支最终都会调用res.json()/res.send()返回响应,内部的异步操作都加上了异常捕获,不会因为分支遗漏或者异步报错卡住响应。 - 可以先替换成最简全局错误处理中间件验证问题:
app.use((err, req, res, next) => { console.error('错误信息:', err); res.status(err.statusCode || 500).json({ status: err.status || 'error', message: err.message || '服务内部错误' }); });
替换后如果登录错误时能正常返回错误信息,就可以确认是原有全局错误处理中间件的问题,再逐行排查内部逻辑即可。
3. 附带优化点:你当前密码错误、用户未激活返回的状态码是404,不符合HTTP规范,建议修改为401(未授权),避免语义混淆。
内容的提问来源于stack exchange,提问作者Amandeep Bisht
相关产品推荐
相关产品推荐

