接口不管成功失败都返回 HTTP 200,错误信息在 body 的 code 字段里。前端拦截器只看 status,所有失败都走进成功分支,页面显示空白。乍看像缓存或者权限的锅,追下去往往不是。
if (!resp.ok) throw new ApiError(resp.status, (await resp.json()).code); if (data.code !== 0) throw new ApiError(200, data.code);
追下去是这么回事:网关和监控按 HTTP 状态码统计错误率,业务方为了指标好看把错误都包成 200。前端只能靠 body 判断,但拦截器里没写这段逻辑,异常就漏到了渲染层,报错信息也进不了监控。
「业务错误码」这类改动最怕改一半,回滚脚本先准备好,再动生产。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,认证失败用 401 权限不足用 403 参数错误用 400 服务端异常用 500;业务错误码放在 body 里 但 HTTP 状态码要能反映大类;前端拦截器先看 status 再看 code 两层都要有分支;把错误码表维护成一份共享配置 前后端按同一份实现。
验收就看一点,造一个参数错误的请求 浏览器 Network 里状态码是 400 前端提示的是具体字段而不是空白页。
