我一直在努力理解错误处理如何在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 。两者似乎都可以工作,但这都取决于您的特定使用情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句