Node.js 在nodejs中的管道流中发生错误事件后,如何恢复?

Node.js 在nodejs中的管道流中发生错误事件后,如何恢复?,node.js,stream,Node.js,Stream,在MyWritableStream中发出错误事件后,数据传输停止。我需要做什么才能恢复数据传输 var readable = fs.createReadStream('test.txt'); var writable = new MyWritableStream(); writable.on('error', function(error) { console.log('error', error); // How i can resume? }); writable.on(

在MyWritableStream中发出错误事件后,数据传输停止。我需要做什么才能恢复数据传输

var readable = fs.createReadStream('test.txt');
var writable = new MyWritableStream();

writable.on('error', function(error) {
    console.log('error', error);
    // How i can resume?
});

writable.on('finish', function(){
    console.log('finished');
})

readable.pipe(writable);

我不确定这是否是一种正常的做法,但我现在还看不到另一种解决方案&它对我有效。如果你能建议更准确的解决方案,请这样做

我们可以使用可写事件中的
pipe
事件跟踪可读流实例:

function WriteableStream(options) {
    Writable.call(this, options);

    this.source = null;

    var instance = this;

    this.on('pipe', function(source){
        instance.source = source;
    });
}
util.inherits(WriteableStream, Writable);
所以,当我们发出错误事件,并且可读流自动取消管道时,我们可以自己重新管道它:

WriteableStream.prototype._write = function(chunk, encoding, done) {
    this.emit('error', new Error('test')); // unpipes readable
    done();
};

WriteableStream.prototype.resume = function() {
    this.source.pipe(this); // re-pipes readable
}
最后,我们将按以下方式使用它:

var readable = fs.createReadStream(file);
var writeable = new WriteableStream();

writeable.on('error', function(error) {
    console.log('error', error);
    writeable.resume();
});

readable.pipe(writeable);

我知道这个问题很老,但你可能想看看

我构建它的原因与此完全相同(最适用于可搜索的流)

如果定义一个返回可读流的函数,库将测量在遇到错误之前已通过的字节数

一旦可读流遇到
错误
事件,它将调用已定义的函数,读取字节数,以便您可以索引流源

例如:

const fs=require('fs');
常数xresilient=require('xresilient');
常量readable=xresilible({bytesRead})=>{
返回generateSeekableStreambody({start:bytesRead});
},{重试次数:5});
常量writeable=fs.createWriteStream('file.test');
可读管道(可写);
  • 文件流可通过函数的
    start
    选项进行索引
  • HTTP请求可以使用HTTP头进行索引
看看吧。