我在尝试从读取文件并通过 csv-parse 管道传输的函数中报告错误时遇到问题。我想做的是,如果有一行没有三个字段,我想报告一个错误 - 到 async.series 调用。第一次实现失败,因为
function insertCsvIntoObject(done) {
fs.createReadStream(inputCsvFilepath)
.pipe(csvParser)
.on('data', function (csvRow) {
console.log('csv row:', csvRow);
if (csvRow.length !== 3) {
this.emit('error', "Does this go anywhere?");
}
})
.on('end', function () {
done(null, "Finished reading through the csv data");
})
.on('error', function (err) {
console.log('errors is now:', csvReadErrors);
done(new Error('Error reading csv file'), "CSV Parse error");
});
}
这给出了一个异常:[错误:已调用回调。 如果我们在 csv 文件中有多个有问题的行。
在完成之前添加退货
return done(new Error('Error reading csv file'), "CSV Parse error");
也没有帮助,因为我们不能停止并从父函数 - insertCsvIntoObject 返回。
此外,如果有任何错误事件,.on('end',..) 事件永远不会被触发。
在这种情况下报告错误的正确方法是什么?
一行上的列数不一致时,看起来csv-parse
已经发出错误。换句话说,您不必自己发出一个。
为了防止回调被多次调用,您可以使用打包的类似once
:
function insertCsvIntoObject(done) {
done = once(done);
...
};
理想情况下,您应该能够在第一个错误后结束处理,但我无法阻止解析器解析其他记录(this.end()
似乎不起作用,但也许我错过了一些东西)。