gpt4 book ai didi

node.js - node.js 流的错误处理

转载 作者:IT老高 更新时间:2023-10-28 21:46:18 25 4
gpt4 key购买 nike

处理流错误的正确方法是什么?我已经知道您可以收听一个“错误”事件,但我想了解有关任意复杂情况的更多详细信息。

对于初学者,当你想做一个简单的管道链时你会怎么做:

input.pipe(transformA).pipe(transformB).pipe(transformC)...

您如何正确地创建其中一种转换以便正确处理错误?

更多相关问题:

  • 当错误发生时,'end' 事件会发生什么?它永远不会被解雇吗?它有时会被解雇吗?它是否取决于转换/流?这里的标准是什么?
  • 是否有任何机制可以通过管道传播错误?
  • 域是否有效地解决了这个问题?例子会很好。
  • “错误”事件产生的错误是否有堆栈跟踪?有时?绝不?有没有办法从他们那里得到一个?

最佳答案

变换

转换流既可读又可写,因此是非常好的“中间”流。因此,它们有时被称为 through 流。它们在这种方式上类似于双工流,不同之处在于它们提供了一个很好的接口(interface)来操作数据,而不仅仅是发送数据。转换流的目的是在数据通过流传输时对其进行操作。例如,您可能想做一些异步调用,或者派生几个字段,重新映射一些东西等。


Where you might put a transform stream


有关如何创建转换流,请参阅 herehere .你所要做的就是:

  1. 包含流模块
  2. 实例化(或继承自)Transform 类
  3. 实现一个 _transform 方法,该方法采用 (chunk, encoding, callback)

block 是你的数据。如果您在 objectMode = true 中工作,大多数情况下您无需担心编码问题。当您完成处理 block 时调用回调。然后将该 block 推送到下一个流。

如果你想要一个很好的帮助模块,它可以让你非常轻松地通过流,我建议 through2 .

关于错误处理,请继续阅读。

管道

在管道链中,处理错误确实很重要。根据this thread .pipe() 不是为转发错误而构建的。所以像......

var a = createStream();
a.pipe(b).pipe(c).on('error', function(e){handleError(e)});

... 只会监听流 c 上的错误。如果在 a 上发出错误事件,则不会向下传递,实际上会抛出。要正确执行此操作:

var a = createStream();
a.on('error', function(e){handleError(e)})
.pipe(b)
.on('error', function(e){handleError(e)})
.pipe(c)
.on('error', function(e){handleError(e)});

现在,虽然第二种方法更冗长,但您至少可以保留错误发生位置的上下文。这通常是一件好事。

我觉得有一个库很有帮助,但如果您只想在目的地捕获错误并且您不太关心它发生在哪里,那么 event-stream .

结束

当触发错误事件时,不会触发结束事件(显式)。发出错误事件将结束流。

根据我的经验,域名大部分时间都运行良好。如果您有未处理的错误事件(即在没有监听器的情况下在流上发出错误),服务器可能会崩溃。现在,正如上面的文章所指出的,您可以将流包装在应该正确捕获所有错误的域中。

var d = domain.create();
d.on('error', handleAllErrors);
d.run(function() {
fs.createReadStream(tarball)
.pipe(gzip.Gunzip())
.pipe(tar.Extract({ path: targetPath }))
.on('close', cb);
});

域的美妙之处在于它们将保留堆栈跟踪。尽管事件流在这方面也做得很好。

如需进一步阅读,请查看 stream-handbook .相当深入,但 super 有用,并提供了许多有用模块的链接。

关于node.js - node.js 流的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21771220/

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