发生错误时停止node-csv-parser

时间:2012-11-02 17:19:37

标签: node.js parsing csv

我正在使用node-csv-parser(http://www.adaltas.com/projects/node-csv/from.html)来解析上传到节点+ express实例的CSV文件。 当错误发生在'record'事件中时,我想停止文件解析并将错误返回给客户端,但是'error'事件被多次调用(对于CSV文件中的每个记录)。

这是我的代码:

  csv()
  .from(req.files.file.path)
  .on('record', function(data, index){
    var date = data[0];
    var vehicle = data[1];
    var taxId = data[4];
    var customer = data[7];
    var address = data[8] + ' ' + data[9];
    var quantity = data[10]
    console.log(date + ' | ' + vechile + ' | ' + taxId + ' | ' + customer + ' | ' + address + ' | ' + quantity);
  })
  .on('end', function() {
    fs.unlinkSync(req.files.file.path);
    res.end();
  })
  .on('error', function(error) {
    fs.unlinkSync(req.files.file.path);
    console.log('HI');
    res.end('error|' + req.files.file.name);
  });

如上所示,打印到控制台的完整记录时会出现故意错误。称为车辆的变量是错误输入的(vechile)。然后多次触发“错误”事件多次向控制台打印“HI”。

我想要的是在第一个错误发生时中断文件解析,这样我就可以正确地删除文件(现在它被删除了几次,第二次失败了)并将错误返回给客户端。 / p>

我尝试使用end()方法,但它没有用。

我是否在正确的轨道上?有什么建议吗?

提前致谢

3 个答案:

答案 0 :(得分:0)

我想我会尝试这样做。 仅在end方法上清理文件。 在使用csv解析器的函数内捕获进程外变量中的任何错误。

使用结果读完csv后返回给用户。

function parseCsv(req, res) {
 var errs = [];
csv()
  .from(req.files.file.path)
  .on('record', function(data, index){
   //
  })
  .on('end', function() {
    fs.unlinkSync(req.files.file.path);
    rs.end(errs);
  })
  .on('error', function(error) {
    errs.push(error);
  });
}

客户端可以检查返回并确定对客户端的响应应该是什么。 您可以将此函数移动到它自己的模块中,并将filePath和cb作为参数来进一步解耦代码,但除了您要查看的内容之外。 这样做的一个好处是您可以一次显示所有错误,因此用户可以修复文件一次并重新提交。

缺点是你正在处理整个文件,但我没有办法停止处理这个库中的文件。

答案 1 :(得分:0)

我在GitHub上写了这个问题的详细答案: https://github.com/wdavidw/node-csv-parser/issues/58

答案 2 :(得分:0)

您可以这样做:

let csvstream = csv.fromPath(csvFile, opt)
  .on('error', (data) => {
    csvstream.pause();
    // Do whatever to handle error

    // If you want to restart csv processing
    csvstream.resume();
  })
  .on('data', (data) => {
     // Do whatever
  });

我正在使用版本2.4.1