首页 > 解决方案 > 有没有办法知道数据是否正在通过管道传输到快速响应中?

问题描述

如果我有一个Readable流,我可以通过管道将其响应如下:

app.use(function(req, res) {
  stream.pipe(res);
});
  1. 如果我面前没有这段代码,但我确实可以访问该res对象,有没有办法知道有什么东西正在被输入它?并知道它何时完成?

  2. 我注意到我仍然可以使用res.send(),并且res.end()在传输某些内容时,响应会发生什么?有规则吗?

标签: expressstream

解决方案


  1. 存在可写流的pipe事件:

    当在可读流上调用 stream.pipe() 方法时,会发出该'pipe'事件,将此可写添加到其目标集。

    所以我认为以下方法可行:

-

export async function myHandler(req, res) {
    const reader = getReadableStreamSomehow();

    res.on('pipe', src => {
        console.log('Something is piping into the response');
        assert.equal(src, reader);
    });

    reader.pipe(res);
}

参考:https ://nodejs.org/api/stream.html#stream_event_pipe

  1. 不能确切地说,但你可能会遇到意想不到的副作用。res.send()最终调用res.end()如下所示。由于res是一个流,我最好的猜测是它取决于。您可以有多个项目写入/管道到res,但 A 可能在 B 之前完成,因此 B 的内容可能会替换 A 的内容,反之亦然。

推荐阅读