前端调用接口后 JSON.parse 报语法错误,网络面板里响应内容是一段 HTML。日志里能对上时间点,这种反而好排。
接口 500 或路由未命中时返回了错误页面,前端仍按 JSON 解析。这一点先确认清楚,后面就不用反复试。
const r = await fetch('/api/list');
const ct = r.headers.get('content-type') || '';
if (!ct.includes('application/json')) {
throw new Error('非 JSON 响应: ' + (await r.text()).slice(0, 100));
}
const data = await r.json();
「JS Unexpected token」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。改完隔一天再看一次,当场正常不代表能稳住。
处理上按这个顺序:先检查响应状态码和内容类型;解析前判断 content-type;给接口加统一错误返回。
结果对不对很好判断,异常时能明确看到返回的是错误页而不是解析报错,问题定位到后端路由。