如何对Node.js流管道中的错误事件做出正确反应?

弗雷尼亚

我一直在努力理解错误处理如何在Node.js流管道中工作,最终我使用了一个简单的游乐场进行试验,这对我来说很清楚。

我将其发布为一个自我解答的问题。也许有人觉得这很有帮助:)

弗雷尼亚

操场

让我们创建连接到管道中的三个名为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流的管道传输,除此之外没有其他操作。也就是说,S1流仍在等待某人读取其数据,而S2流仍通过管道传输到S3中,并且可以(理论上)发送数据。

这是您需要在代码中处理的事情!一种选择是调用end()S1和S2上方法。另一个方法是使用该pipe()方法重新连接S1和S2 两者似乎都可以工作,但这都取决于您的特定使用情况。

学分

  1. Ben Nadel博客的这篇文章为我指出了正确的方向。
  2. 这个SO问题从稍微不同的角度解决了一个相似的主题。答案中也有一些很好的指示。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Node.js-如何处理流错误事件

来自分类Dev

如何为node.js流管道创建目标路径?

来自分类Dev

如何对Go中的按键事件做出反应?

来自分类Dev

如何使 NavBar 中的 onClick 事件做出反应?

来自分类Dev

Node.js抛出未处理的错误事件

来自分类Dev

Node.js抛出未处理的错误事件

来自分类Dev

如何使用PHP在DropZone中触发错误事件?

来自分类Dev

如何获取在indexedDB.deleteDatabase中触发的错误事件?

来自分类Dev

使用 Node,如何使用 Connect 处理数据/结束/错误事件?

来自分类Dev

WebSocket ws如何模拟错误事件?

来自分类Dev

如何使用Python处理数据流管道中的BigQuery插入错误?

来自分类Dev

流管道上的Node.Js异步迭代器

来自分类Dev

如何使容器的ScreenX事件做出反应?

来自分类Dev

如何检查Node JS中的错误类型?

来自分类Dev

如何使QStyledItemDelegate的子类在PySide / PyQt中的QListView中对鼠标悬停做出正确反应?

来自分类Dev

如何使Node js同步?

来自分类Dev

如果不鼓励使用forceUpdate(),组件应如何对模型中的更改事件做出反应?

来自分类Dev

如果不鼓励使用forceUpdate(),则组件应如何对模型中的更改事件做出反应?

来自分类Dev

在AppBarLayout在CoordinatorLayout中折叠之前,如何使FAB对向下滚动事件做出反应

来自分类Dev

C#-如何对另一个类中引发的事件做出反应?

来自分类Dev

如何收听所有图像的错误事件?

来自分类Dev

如何捕获Chrome字段验证错误事件

来自分类Dev

如何在node.js中管道到Redis?

来自分类Dev

如何对baconJS中的takeUntil流做出反应

来自分类Dev

如何对baconJS中的takeUntil流做出反应

来自分类Dev

如何对超电网中的onclick做出反应

来自分类Dev

如何对列表中的行点击做出反应?

来自分类Dev

Node.JS中的事件循环如何可预测

来自分类Dev

Node.JS中的事件循环如何可预测

Related 相关文章

  1. 1

    Node.js-如何处理流错误事件

  2. 2

    如何为node.js流管道创建目标路径?

  3. 3

    如何对Go中的按键事件做出反应?

  4. 4

    如何使 NavBar 中的 onClick 事件做出反应?

  5. 5

    Node.js抛出未处理的错误事件

  6. 6

    Node.js抛出未处理的错误事件

  7. 7

    如何使用PHP在DropZone中触发错误事件?

  8. 8

    如何获取在indexedDB.deleteDatabase中触发的错误事件?

  9. 9

    使用 Node,如何使用 Connect 处理数据/结束/错误事件?

  10. 10

    WebSocket ws如何模拟错误事件?

  11. 11

    如何使用Python处理数据流管道中的BigQuery插入错误?

  12. 12

    流管道上的Node.Js异步迭代器

  13. 13

    如何使容器的ScreenX事件做出反应?

  14. 14

    如何检查Node JS中的错误类型?

  15. 15

    如何使QStyledItemDelegate的子类在PySide / PyQt中的QListView中对鼠标悬停做出正确反应?

  16. 16

    如何使Node js同步?

  17. 17

    如果不鼓励使用forceUpdate(),组件应如何对模型中的更改事件做出反应?

  18. 18

    如果不鼓励使用forceUpdate(),则组件应如何对模型中的更改事件做出反应?

  19. 19

    在AppBarLayout在CoordinatorLayout中折叠之前,如何使FAB对向下滚动事件做出反应

  20. 20

    C#-如何对另一个类中引发的事件做出反应?

  21. 21

    如何收听所有图像的错误事件?

  22. 22

    如何捕获Chrome字段验证错误事件

  23. 23

    如何在node.js中管道到Redis?

  24. 24

    如何对baconJS中的takeUntil流做出反应

  25. 25

    如何对baconJS中的takeUntil流做出反应

  26. 26

    如何对超电网中的onclick做出反应

  27. 27

    如何对列表中的行点击做出反应?

  28. 28

    Node.JS中的事件循环如何可预测

  29. 29

    Node.JS中的事件循环如何可预测

热门标签

归档