Ajax 请求被缓存了怎么办?

Mr.卫红 阅读 5

我用 fetch 发起一个 GET 请求获取用户数据,但发现第二次请求直接返回了缓存结果,根本没发到服务器!明明后端数据已经变了。

试过在 URL 后面加时间戳参数,比如 ?t=Date.now(),虽然能绕过缓存,但感觉不太优雅。有没有更规范的解决办法?是不是应该让后端控制缓存头?

这是我的请求代码:

fetch('/api/user/profile')
  .then(res => res.json())
  .then(data => console.log(data));
我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
俊美 Dev
这个问题很常见,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