【问题标题】:reporting errors when using async with streams node.js将异步与流 node.js 一起使用时报告错误
【发布时间】:2016-09-16 14:50:12
【问题描述】:

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

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

【问题讨论】:

    标签: javascript node.js error-handling stream


    【解决方案1】:

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

    为了防止回调被多次调用,可以使用once这样的封装:

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

    理想情况下,您应该能够在第一个错误后结束处理,但我无法阻止解析器解析其他记录(this.end() 似乎不起作用,但也许我错过了东西)。

    【讨论】:

    • 公平。我最终使用了relax_column_count
    • 公平。我发现发出错误似乎并不是将错误返回到异步的最佳方法——因为进程异常结束而没有读取整个文件。我最终使用relax_column_count 使csv-parse 读到最后(因为我可能有更多的检查来确保一行中的字段是有效的——我可能想有条件地删除记录而不是停止整个过程),然后收集所有错误并通过回调将它们发送回 async in .on('end', ...) 感谢您提供有关 once(done) 的提示 :-)
    猜你喜欢
    • 2012-09-02
    • 2015-05-26
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多