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

时间:2016-08-03 08:35:03

标签: javascript node.js stream

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

  1. 假设我们有一个readable流。
  2. 我们将其管道传输到transform流。
  3. transform流以某种方式发出error
  4. 我们希望恢复readable流(及其所有数据),并将其重新传输到另一个transform流中。
  5. 第4步似乎很难:我可以在目标流(unpipe流)上收听transform事件并检索对源流的引用({{ 1}} stream),但至少有一些数据丢失了。

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

    一个真实的例子是readable内容编码,where in some cases,您需要deflate而不是zlib.createInflateRaw(),但我们无法确定哪一个是正确的在查看响应体缓冲区之前做出选择。

1 个答案:

答案 0 :(得分:1)

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

(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