You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express Mongoose 自动缓存疑问:浏览器请求/api/cars返回304状态码

为什么我的Express GET接口第二次访问返回304状态码?

这是浏览器与Express默认缓存机制共同作用的结果,我来帮你理清这个现象:

首先先看你提供的接口实现代码:

app.get('/cars', (req, res, next) => {
  Car.find()
    .exec()
    .then(cars => {
      res.status(200).send(cars);
    }, error => {
      next(error);
    });
});

304状态码出现的原因

当你第一次用浏览器访问/api/cars时,服务器返回200状态码和车辆数据,同时浏览器会自动缓存该响应,并记录响应头里的ETag(资源唯一标识)和Last-Modified(资源最后修改时间)。

第二次访问同一个接口时,浏览器会在请求头里带上If-None-Match(对应之前缓存的ETag)和If-Modified-Since(对应之前缓存的Last-Modified)。Express收到请求后会自动对比这些标识:

  • 如果服务器上的车辆数据没有发生变化,Express就返回304状态码,告诉浏览器「资源没更新,直接用你缓存的版本就行」;
  • 如果数据有更新,才会返回200状态码和最新数据。

如何禁用缓存行为?

如果你的车辆数据是实时更新的,不想让浏览器缓存,可以在响应中添加缓存控制头,强制浏览器每次都向服务器请求最新数据:

app.get('/cars', (req, res, next) => {
  Car.find()
    .exec()
    .then(cars => {
      // 设置缓存控制头,禁用各类缓存
      res.set({
        'Cache-Control': 'no-store, no-cache, must-revalidate, proxy-revalidate',
        'Expires': '0',
        'Pragma': 'no-cache'
      });
      res.status(200).send(cars);
    }, error => {
      next(error);
    });
});

这样处理后,浏览器每次访问都会发起完整请求,服务器也会返回200状态码和最新数据。

内容的提问来源于stack exchange,提问作者Combustible Pizza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:59:46