与流node.js使用异步时报告错误

时间:2016-05-19 15:39:39

标签: javascript node.js error-handling stream

我在尝试报告来自我读取文件的函数并通过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',..)事件永远不会被触发。

在这种情况下报告错误的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

当一行中的列数不一致时,csv-parse似乎已经发出错误。换句话说,你不应该自己发射一个。

为防止多次调用回调,您可以使用类似once的打包:

function insertCsvIntoObject(done) {
  done = once(done);
  ...
};

理想情况下,您应该能够在第一次出错后结束处理,但我还没有能够阻止解析器解析其他记录(this.end()似乎无法正常工作,但也许我错过了什么。)