我正在尝试实现以下错误处理:
readable
流。transform
流。transform
流以某种方式发出error
。readable
流(及其所有数据),并将其重新传输到另一个transform
流中。 第4步似乎很难:我可以在目标流(unpipe
流)上收听transform
事件并检索对源流的引用({{ 1}} stream),但至少有一些数据丢失了。
我们可以在不创建自定义转换流的情况下执行此操作吗?
一个真实的例子是readable
内容编码,where in some cases,您需要deflate
而不是zlib.createInflateRaw()
,但我们无法确定哪一个是正确的在查看响应体缓冲区之前做出选择。
答案 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
。