如何在express-redis-cache中为缓存响应添加自定义响应头?
解决express-redis-cache缓存响应丢失自定义头的问题
我之前踩过一模一样的坑!express-redis-cache默认只会缓存响应的body内容,不会自动同步你在路由里设置的Cache-Control、Last-Modified这类自定义响应头。要解决这个问题,只需要调整缓存配置,让它把响应头也一起存进Redis,下次命中缓存时自动带上这些头。
具体修改步骤:
开启响应头缓存配置
在cache.route()的选项里添加headers参数,你可以指定要缓存的具体头(更精准),或者直接设为true缓存所有响应头:cache.route({ expire: { 200: 3600, xxx: 0 }, // 方式1:只缓存指定的两个头 headers: ['Cache-Control', 'Last-Modified'] // 方式2:缓存所有响应头 // headers: true })确保响应头在缓存捕获前已设置
你的路由代码里,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
相关产品推荐
相关产品推荐

