在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);
答案 0 :(得分:2)
我知道这个问题很旧,但是您可能想查看https://github.com/miraclx/xresilient
我出于同样的原因构建了此文件(对于可搜索的流效果最佳)。
您定义了一个返回可读流的函数,该库测量直到遇到错误为止经过的字节数。
一旦可读流遇到error
事件,它就会使用读取的字节数来调用已定义的函数,以便您可以对流源进行索引。
示例:
const fs = require('fs');
const xresilient = require('xresilient');
const readable = xresilient(({bytesRead}) => {
return generateSeekableStreamSomehow({start: bytesRead});
}, {retries: 5});
const writable = fs.createWriteStream('file.test');
readable.pipe(writable);
start
选项建立索引。Range
HTTP标头建立索引。答案 1 :(得分:1)
我不确定,如果这是正常做法,但我现在看不到另一种解决方案。这个对我有用。如果您可以提供更准确的解决方案,请执行此操作。
我们可以使用可写的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);