Javascript 当目标流发出错误事件时,我们能否以某种方式重用源流?

Javascript 当目标流发出错误事件时,我们能否以某种方式重用源流?,javascript,node.js,stream,Javascript,Node.js,Stream,我正在尝试实现以下错误处理: 假设我们有一个可读的流 我们将其导入一个转换流 不知何故,转换流发出一个错误 我们希望恢复可读的流(及其所有数据),并将其重新导入另一个转换流 第4步似乎很困难:我可以监听目标流(转换流)上的取消管道事件,并检索对源流(可读流)的引用,但至少它的一些数据块已丢失 我们可以在不创建自定义转换流的情况下执行此操作吗? 一个真实的例子是缩写< /代码>内容编码,你需要 ZLIB .CudioActudiAuthAuth[Audio](代码)>而不是 ZLIB。CueRea

我正在尝试实现以下错误处理:

  • 假设我们有一个
    可读的
  • 我们将其导入一个
    转换
  • 不知何故,
    转换
    流发出一个
    错误
  • 我们希望恢复
    可读的
    流(及其所有数据),并将其重新导入另一个
    转换
  • 第4步似乎很困难:我可以监听目标流(
    转换
    流)上的
    取消管道
    事件,并检索对源流(
    可读
    流)的引用,但至少它的一些数据块已丢失

    我们可以在不创建自定义转换流的情况下执行此操作吗?


    一个真实的例子是<代码>缩写< /代码>内容编码,你需要<代码> ZLIB .CudioActudiAuthAuth[Audio](代码)>而不是<代码> ZLIB。CueRealAudio()/代码>,但是我们不能决定在查看响应体缓冲区之前哪一个是正确的选择。

    < P>你不需要在中间引入一个流来读取第一个字节。例如:

    (function readChunk() {
      var chunk = res.read();
      if (!chunk)
        return res.once('readable', readChunk);
    
      var inflate;
      if ((chunk[0] & 0x0F) === 0x08)
        inflate = zlib.createInflate();
      else
        inflate = zlib.createInflateRaw();
    
      // Put chunk back into stream
      res.unshift(chunk);
    
      // Prepare the decompression
      res.pipe(inflate);
    
      output = new Response(inflate, response_options);
      resolve(output);
    })();
    

    另外,
    var body=res.pipe(new stream.PassThrough())
    是不必要的,您可以在适当的地方使用
    res

    现在大多数网站都不支持gzip吗?只要在您的请求中发送
    Accept Encoding:gzip
    ,您就不必担心任何deflate问题。@mscdex您是对的,但是对于http库,我们不能忽略那些旧的和疯狂的deflate-only服务器,我最终做到了这一点,这似乎是目前我能做的最好的事情。