stream: Readable iterator unhandled error when piping
- Version: 12.4
- Platform: Ubuntu 18.04
When using asyncIterator
on a piped stream, the error is not handled correctly.
const fs = require('fs');
const { PassThrough } = require('stream');
async function print() {
const read = fs.createReadStream('file');
const iterator = read.pipe(new PassThrough())
for await (const k of iterator) {
console.log(k);
}
}
print()
.then(() => console.log('done')) // never called
.catch(console.log); // never called
In the above example, the .catch
is not catching the error, and the script crashes.
I know, that I should catch the error of each stream, but if I do:
read.on('error', console.log);
The print
function never resolves nor rejects. The only solution I've found is to emit the error to the piped stream.
async function print() {
const read = fs.createReadStream('file');
const stream = new PassThrough();
read.on('error', (err) => stream.emit('error', err));
const iterator = read.pipe(stream);
for await (const k of iterator) {
console.log(k);
}
}
When you have multiple pipes, this can get very ugly. I don't know if this is the intended behaviour, but makes it hard & ugly to work with async iterators.