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
相关产品推荐
相关产品推荐

