动态数据的缓存控制:Express.JS

51

如何在express.js中为JSON响应设置缓存控制策略?

由于我的JSON响应根本不会改变,所以我希望可以积极地对其进行缓存。

我已经找到了如何对静态文件进行缓存,但是不知道如何对动态数据进行缓存。

3个回答

80

不太优雅的方法是在任何JSON输出之前添加对res.set()的调用。在那里,您可以指定设置缓存控制标头,它将相应地进行缓存。

res.set('Cache-Control', 'public, max-age=31557600'); // one year

另一种方法是在路由中将res属性设置为您的 JSON 响应,然后使用回退中间件(在错误处理之前)来呈现并发送 JSON。

app.get('/something.json', function (req, res, next) {
  res.JSONResponse = { 'hello': 'world' };
  next(); // important! 
});

// ...

// Before your error handling middleware:

app.use(function (req, res, next) {
  if (! ('JSONResponse' in res) ) {
    return next();
  }

  res.set('Cache-Control', 'public, max-age=31557600');
  res.json(res.JSONResponse);
})

编辑:针对Express v4,已从res.setHeader更改为res.set


难道不是 res.header('Cache-Control', 'public, max-age=31557600') 吗? - Yuri Astrakhan
11
注意,使用 Express 4.x 版本时,你必须使用 res.set({ headers })res.header({ headers }) 替代 res.setHeader({ headers }),因为官方文档已经更新 - Clément Fiorio
这对我没有起作用。我已经发布了类似的问题,仍在等待答案。有人能帮我吗?问题链接:https://stackoverflow.com/questions/55700579/setting-cache-control-pubic-not-caching-xhr - VISHAL DAGA
1
头文件中的 public 是做什么用的? - João Pimentel Ferreira
如何使用API响应删除公共缓存。我尝试了cache-control:no-cache,no-store但不起作用。 - Himanshu Shekhar
显示剩余2条评论

7
你可以像这样去做,例如:
res.set('Cache-Control', 'public, max-age=31557600, s-maxage=31557600'); // 1 year

16
尽管这段代码片段可能解决了问题,但包括解释真的有助于提高您发布的质量。请记住您正在回答未来读者的问题,这些人可能不知道您提供代码建议的原因。 - Clijsters

0

最近我也有同样的问题,对我有用的方法是:

const express = require('express');
const app = express();
const port = 3000;
let options = {
  maxAge: '2y',
  etag: false
}

app.use(express.static('public', options));

通过maxAge,您可以设置缓存时间。 文档:https://expressjs.com/zh-cn/starter/static-files.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接