列表接口加了协商缓存后,控制台开始出现 SyntaxError: Unexpected end of JSON input,Network 面板里这些请求状态是 304,Size 列显示 0 B。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
fetch('/api/list', { cache: 'no-cache' })
.then(r => r.status === 304 ? null : r.json());
304 按协议不带响应体,浏览器把本地缓存的内容交给页面,但 fetch 拿到的 response 里 body 是空的。代码无条件调 res.json(),解析空字符串就抛错。这一点先确认清楚,后面就不用反复试。
碰到「304 空响应体」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
具体做法是,在请求封装里判断 status 为 304 时走缓存分支;需要最新数据就带 cache 选项 让浏览器跳过缓存;不要对 304 调 json() 先看 content-length;统一在拦截器里处理 避免每个页面各写一遍。
改完照着核一遍,304 请求不再抛解析错误 页面展示缓存里的数据 刷新后能拿到新内容。
