Ajax 请求被缓存了怎么办? Mr.卫红 提问于 2026-03-12 23:00:19 阅读 74 前端 我用 fetch 发起一个 GET 请求获取用户数据,但发现第二次请求直接返回了缓存结果,根本没发到服务器!明明后端数据已经变了。 试过在 URL 后面加时间戳参数,比如 ?t=Date.now(),虽然能绕过缓存,但感觉不太优雅。有没有更规范的解决办法?是不是应该让后端控制缓存头? 这是我的请求代码: fetch('/api/user/profile') .then(res => res.json()) .then(data => console.log(data)); 我来解答 赞 8 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 司空玉杰 Lv1 这个问题很常见,fetch 默认行为就是会读缓存的,特别是 GET 请求。 最规范的解决办法是在 fetch 里加 cache 选项: fetch('/api/user/profile', { cache: 'no-store' }) .then(res => res.json()) .then(data => console.log(data)); no-store 的意思是告诉浏览器完全绕过缓存,每次都发请求到服务器。相应的还有 no-cache,它会缓存但每次用之前要跟服务器验证一下哪个更新。如果你想更彻底,可以在请求头里加: fetch('/api/user/profile', { cache: 'no-store', headers: { 'Cache-Control': 'no-cache' } }) 至于后端要不要控制缓存头,那是另外一层保障。对于这种用户数据这种频繁变化的接口,后端设置 Cache-Control: no-store, no-cache, must-revalidate 是最佳实践。不过前端自己控制 cache 选项是最直接的,优先级更高。 时间戳那种写法也不是不能用,就是太土了,URL 变得脏乎乎的,调试的时候看着难受。 回复 点赞 2026-03-14 11:06 俊美 Dev Lv1 这个问题很常见,fetch 默认会遵守 HTTP 缓存规则,GET 请求很容易被浏览器缓存。 最直接的解决办法是在 fetch 配置里加 cache 选项: fetch('/api/user/profile', { cache: 'no-store' // 彻底禁用缓存,每次都发请求 }) .then(res => res.json()) .then(data => console.log(data)) cache 还有几个可选值: - no-store 完全不缓存 - no-cache 缓存但每次都验证(类似 ETag 机制) - reload 忽略缓存,重新获取 如果你想更规范一些,可以让后端在响应头里控制缓存行为。在后端加上: // Node.js/Express 示例 res.set('Cache-Control', 'no-cache, no-store, must-revalidate'); res.set('Pragma', 'no-cache'); // 兼容 HTTP/1.0 res.set('Expires', '0'); 这样前端不加任何配置也能禁用缓存。两种方式结合用最稳妥,前端防一手,后端再防一手。 时间戳那种做法确实 low,能用配置解决就用配置吧。 回复 点赞 2026-03-12 23:02 加载更多 相关推荐 2 回答 56 浏览 Ajax 请求被缓存了怎么办? 我用 jQuery 发了个 Ajax 请求,结果发现浏览器直接返回缓存数据,根本没发新请求!明明后端数据已经变了,前端却还是旧的。 我试过加时间戳:url + '?t=' + Date.now(),但... A. 志红 前端 2026-03-16 11:03:19 1 回答 53 浏览 Ajax请求出错时怎么统一处理错误? 我用原生 fetch 做 Ajax 请求,但每次都要写一遍 catch,感觉很重复。比如网络断了或者后端返回 500,我想统一弹个提示,而不是每个请求都单独处理。 试过在 fetch 外面包一层函数,... 闲人耘博 前端 2026-03-17 17:00:22 1 回答 50 浏览 Ajax发送JSON数据时服务器返回400错误怎么办? 我在用jQuery的$.ajax发送POST请求时,把数据对象直接写在data参数里,服务器提示400错误说"Unexpected token"。 尝试过把contentType设成applicati... 公孙庆玲 前端 2026-02-16 20:31:24 2 回答 48 浏览 为什么设置了timeout的JQuery Ajax请求还是没超时? 我在用JQuery的$.ajax发请求时设置了timeout: 2000,但实际测试发现请求超过3秒后还是继续执行了,甚至没有触发error回调。之前试过把timeout改成1000都试过,但问题依旧... 欣怡酱~ 前端 2026-02-16 15:10:33 2 回答 67 浏览 Ajax重试机制怎么设置自适应延迟和避免重复提交? 在开发订单提交功能时,遇到网络波动导致Ajax请求失败需要重试。现在用递归setTimeout实现重试,但问题来了:retryCount++后每次固定延迟2秒,遇到服务器503错误时想改成指数递增延迟... 俊蓓 Dev 前端 2026-02-08 21:01:30 1 回答 193 浏览 CSRF Token在AJAX请求中失效怎么办?后端返回403错误 我在做用户资料更新功能时遇到了问题。后端要求所有POST请求必须携带CSRF Token,我按照常规做法在表单里加了隐藏字段_csrf,但用fetch提交时后端一直返回403。 尝试过把token放在... 宇文青燕 安全 2026-01-31 14:00:33 1 回答 39 浏览 如何限制 Vue 中 Ajax 请求的并发数量? 我在用 Vue 做一个文件上传功能,需要同时上传多个文件,但不想让所有请求一起发出去,怕压垮服务器。试过直接用 Promise.all,结果一下子全发了,有没有办法控制最多同时发 3 个请求? 下面是... Mr.哲铭 前端 2026-03-20 14:09:20 2 回答 66 浏览 React中如何正确取消未完成的Ajax请求? 我在用useEffect做数据请求,切换页面时老报“Can't perform a React state update on an unmounted component”错误。试过AbortCon... 公孙万华 前端 2026-03-13 18:31:18 2 回答 42 浏览 如何限制 Ajax 并发请求数量避免浏览器卡死? 我正在做一个图片上传功能,用户一次能选几十张图,我用 Promise.all 发起并发请求,结果浏览器直接卡住了,甚至有些请求失败了。试过自己写队列控制,但逻辑太乱没搞定。 是不是应该限制同时进行的请... Good“嘉木 前端 2026-03-02 18:45:19 2 回答 68 浏览 Vue组件销毁时为什么之前的AJAX请求没被取消? 在做搜索框实时查询功能时,当我快速输入多个字符导致多次发送请求,虽然用了abortController,但页面跳转时控制台还是报错"AbortError",之前的请求好像没完全取消。 我的代码是这样写... Tr° 鑫丹 前端 2026-02-13 18:24:31
最规范的解决办法是在 fetch 里加 cache 选项:
fetch('/api/user/profile', {
cache: 'no-store'
})
.then(res => res.json())
.then(data => console.log(data));
no-store的意思是告诉浏览器完全绕过缓存,每次都发请求到服务器。相应的还有no-cache,它会缓存但每次用之前要跟服务器验证一下哪个更新。如果你想更彻底,可以在请求头里加:fetch('/api/user/profile', {
cache: 'no-store',
headers: {
'Cache-Control': 'no-cache'
}
})
至于后端要不要控制缓存头,那是另外一层保障。对于这种用户数据这种频繁变化的接口,后端设置
Cache-Control: no-store, no-cache, must-revalidate是最佳实践。不过前端自己控制 cache 选项是最直接的,优先级更高。时间戳那种写法也不是不能用,就是太土了,URL 变得脏乎乎的,调试的时候看着难受。
最直接的解决办法是在 fetch 配置里加 cache 选项:
cache 还有几个可选值:
- no-store 完全不缓存
- no-cache 缓存但每次都验证(类似 ETag 机制)
- reload 忽略缓存,重新获取
如果你想更规范一些,可以让后端在响应头里控制缓存行为。在后端加上:
这样前端不加任何配置也能禁用缓存。两种方式结合用最稳妥,前端防一手,后端再防一手。
时间戳那种做法确实 low,能用配置解决就用配置吧。