0

我正在使用 node-csv-parser ( http://www.adaltas.com/projects/node-csv/from.html ) 来解析上传到 node+express 实例的 CSV 文件。当“记录”事件发生错误时,我想停止文件解析并将错误返回给客户端,但“错误”事件被多次调用(对于 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);
  });

正如您在上面看到的,打印控制台完整记录时存在故意错误。名为vehicle 的变量输入错误(vechile)。然后多次触发“错误”事件,将“HI”多次打印到控制台。

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

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

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

提前致谢

4

3 回答 3

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 作为参数以进一步解耦您的代码,但除了您要执行的操作之外。这样做的一个好处是您可以一次显示所有错误,因此用户可以修复文件一次并重新提交。

缺点是您正在处理整个文件,但我看不到停止处理此库中的文件的方法。

于 2012-11-03T06:01:41.993 回答
0

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

于 2012-11-05T21:14:23.763 回答
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

于 2017-10-19T13:58:23.200 回答