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

如何在express-redis-cache中为缓存响应添加自定义响应头?

解决express-redis-cache缓存响应丢失自定义头的问题

我之前踩过一模一样的坑!express-redis-cache默认只会缓存响应的body内容,不会自动同步你在路由里设置的Cache-Control、Last-Modified这类自定义响应头。要解决这个问题,只需要调整缓存配置,让它把响应头也一起存进Redis,下次命中缓存时自动带上这些头。

具体修改步骤:

  1. 开启响应头缓存配置
    在cache.route()的选项里添加headers参数,你可以指定要缓存的具体头(更精准),或者直接设为true缓存所有响应头:

    cache.route({
      expire: { 200: 3600, xxx: 0 },
      // 方式1:只缓存指定的两个头
      headers: ['Cache-Control', 'Last-Modified']
      // 方式2:缓存所有响应头
      // headers: true
    })
    
  2. 确保响应头在缓存捕获前已设置
    你的路由代码里,res.set(...)是在业务中间件之后执行的,这没问题——因为cache.route中间件会在整个请求链路结束、响应发送前,自动捕获当前设置的所有响应头(只要你开启了headers配置),并和body一起存入Redis。

修改后的完整路由代码:

router.get(
  '/:id([a-f0-9]{24})',
  (req, res, next) => {
    // 设置缓存键名
    res.express_redis_cache_name = 'task-' + req.params.id;
    next();
  },
  cache.route({
    expire: { 200: 3600, xxx: 0 },
    headers: ['Cache-Control', 'Last-Modified'] // 启用响应头缓存
  }),
  taskMiddlewares.findByIdWithUser,
  (req, res) => {
    res
      .set({
        'Cache-Control': 'private, must-revalidate',
        'Last-Modified': req.task.updatedAt.toUTCString()
      })
      .json(taskTransformer(req.task));
  }
);

额外注意点:

  • 如果你的express-redis-cache版本比较旧,可能没有headers这个选项,建议升级到最新版本;
  • 如果你需要更灵活的控制,也可以用onHit钩子在缓存命中时手动设置头,但这种方式需要自己从缓存中读取对应的值,不如直接开启headers配置来得方便。

内容的提问来源于stack exchange,提问作者ARIF MAHMUD RANA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:42:57