gpt4 book ai didi

javascript - 如何正确响应 Node.js 流管道中的错误事件?

转载 作者:搜寻专家 更新时间:2023-11-01 00:17:28 25 4
gpt4 key购买 nike

我一直在努力理解错误处理在 Node.js 流管道中是如何工作的,我最终使用一个简单的 Playground 进行了试验,这让我对事情一清二楚。

我将此作为自答问题发布。也许有人觉得它有帮助:)

最佳答案

Playground

让我们创建三个连接到管道中的命名 PassThrough 流并观察各个事件。

var stream = require('stream');

function observedStream(name) {
var s = new stream.PassThrough({objectMode: true});

s.on('error', function(err) { console.log(name + ': ' + err); });
s.on('data', function(data) { console.log(name + ': ' + data); });
s.on('finish', function() { console.log(name + ': FINISH'); });
s.on('end', function() { console.log(name + ': END'); });
s.on('close', function() { console.log(name + ': CLOSE'); });
s.on('unpipe', function() { console.log(name + ': UNPIPE'); });

return s;
}

var s1 = observedStream('S1'),
s2 = observedStream('S2'),
s3 = observedStream('S3');

s1.pipe(s2).pipe(s3);

标准行为

写入管道很简单。我们只是从每个流中获取一个 data 事件。

s1.write('Hello');
// S1: Hello
// S2: Hello
// S3: Hello

让我们看看当我们结束流时会发生什么?那里也没有惊喜。

s1.end();
// S1: FINISH
// S1: END
// S2: FINISH
// S2: UNPIPE
// S2: END
// S3: FINISH
// S3: UNPIPE
// S3: END

错误处理

让我们尝试发出一个错误(显然,如果您调用上面的 s1.end(),您需要先重新创建管道)。

s1.emit('error', new Error('bazinga'));
// S1: Error: bazinga

注意这里没有发生任何其他事情。您可以继续写入 S1,就好像什么也没发生一样。管道未关闭。

当出现“中流”错误时,事情会变得更有趣 :)

s2.emit('error', new Error('bazinga'));
// S2: UNPIPE
// S2: ERROR

请注意,Node.js 会自动从 S2 中取消对 S1 流的管道传输,但不会执行其他任何操作。 IE。 S1 流仍在等待某人读取其数据,S2 流仍通过管道传输到 S3 并且可以(理论上)发送数据。

这是您需要在代码中处理的事情!一种选择是调用 S1 和 S2 上的 end() 方法。另一种方法是使用 pipe() 方法重新连接 S1 和 S2。两者似乎都有效,但这完全取决于您的特定使用场景。

致谢

  1. This article来自 Ben Nadel 的博客为我指明了正确的方向。
  2. This SO question从略有不同的 Angular 处理类似的主题。答案中也有一些很好的建议。

关于javascript - 如何正确响应 Node.js 流管道中的错误事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34948095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com