ExpressJs在每个路由发送响应后执行回调函数

3
情景是将数据保存在缓存中。我们有许多用复杂逻辑编写的express路由。
我必须找到一种方法来保存响应数据在缓存中。我不能去检查每个路由是否需要保存并在发送响应之前保存数据。(如果没有其他办法,那么这可能是唯一的方法)
我尝试过以下方法。
  1. https://nodejs.org/api/http.html#http_event_close_1 - 使用'close''finish',在发送响应后会触发,但我无法在这些事件中获取响应数据。
  2. 此外,我的node版本是v0.10.31
  3. 考虑使用app.all('*', callback),但不确定如何捕获缓存的响应数据。
  4. 最后我想添加第二个回调函数进行路由,app.VERB(path, [callback...], callback),但在第一个回调函数返回响应后,第二个回调函数从未被调用。
希望有解决方案,我已经困扰了一周以上。
之所以在每个路由中添加逻辑是繁琐的工作,是因为我需要添加一个配置项来指定哪些路由需要缓存和过期时间。
响应需要缓存在Redis服务器中。基于路由数据和查询字符串,将生成缓存键。所有完整的用户特定信息都将保存在一个键中。
因此,当用户访问相同的路由时,将生成键来检查它是否已存在,并且数据将被提供而不会继续执行后续中间件。

我有点困惑,这个响应数据是要缓存给所有用户使用的吗?还是会涉及到Sessions? 另外,可以设置一个 app.use 来检查URL并输出适当的头文件以缓存内容。而你所说的 "cache" 是指仅仅在express中保存数据,还是实际上浏览器缓存或其他? - adeneo
@adeneo 响应需要在 redis 服务器 中进行缓存。缓存键将根据路由数据和查询字符串生成。所有这些完整的用户特定信息都将保存在一个键中。因此,当用户访问相同的路线时,将生成键来检查它是否已经存在,使用 app.use 并且数据将被提供而不是前往后续中间件。 - MrVinay1989
为什么不在路由中发送响应后直接添加缓存逻辑呢?你可以在发送响应后执行代码。 - George Eracleous
1
@GeorgeEracleous 感谢您的回复。我完全知道我可以在发送响应之前或之后进行缓存。由于几乎配置了45个路由,我不想更改每个路由中的回调代码以在发送响应之前/之后缓存响应。我只是想知道是否有人尝试过在不修改回调的情况下实现这一点。希望我表达清楚了。 - MrVinay1989
1个回答

0

定义一个回调中间件,如下所示:

var storeResponseMiddleware = function(req, res, next) {
  console.log("storing data in redis....")
  ..........more stuff
}

将其添加到 ExpressJs 应用程序中,如下所示:
app.use(logicRoute)
app.use(storeResponseMiddleware)

现在,对于所有的响应,都将调用storeResponseMiddleware。你必须在路由处理程序中调用next()

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