【问题标题】:NodeJS middleware how to read from a writable stream (http.ServerResponse)NodeJS中间件如何从可写流中读取(http.ServerResponse)
【发布时间】:2023-03-05 06:27:01
【问题描述】:

我正在开发一个由一组中间件加上 node-http-proxy 模块组成的应用程序(使用 Connect not Express),也就是说,我有一个中间件链,例如:

midA -> midB -> http-proxy -> midC 

在这种情况下,响应由代理请求到某个目标并返回内容的 http-proxy 编写。

我想创建一个中间件(比如midB)作为缓存。这个想法是:

  • 如果 url 被缓存,缓存中间件将写入响应并避免继续中间链。
  • 如果 url 未缓存,则缓存中间件通过中间件链中的请求位需要读取要缓存的最终响应内容。

如何做到这一点?还是有别的办法?

干杯

【问题讨论】:

  • 所以您不想要客户端缓存,而是保存您的数据库调用(或其他)?我想说您可以在将响应发送到某种哈希映射之前保存它,然后在您的“缓存”中间件中查找它。
  • 我刚刚更新了问题以获得更好的解释。谢谢
  • 也许您可以简单地使用 github.com/jpodwys/superagent-cache 进行内部 HTTP 调用 - 它内置了所有内容。

标签: node.js caching middleware


【解决方案1】:

回答我自己。 如果你有function(req, res, next){..}这样的中间件,需要读取响应对象的内容。

在这种情况下,res 是一个 http.ServerResponse 对象,一个可写流,允许链中的每个中间件写入符合我们想要返回的响应的内容。

不要混淆使用http.request() 发出请求时得到的响应,即http.IncomingMessage 实际上是一个可读流。

我发现读取所有中间件写入响应的内容的方式是重新定义write 方法:

var middleare = function(req, res, next) {

  var data = "";
  res._oldWrite = res.write;
  res.write = function(chunk, encoding, cb) {
    data += chunck;
    return res._oldWrite.call(res, chunck, encoding, cb);
  }

  ...
}

任何其他解决方案将不胜感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2016-05-28
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多