我正在使用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()方法,但它没有用。
我是否在正确的轨道上?有什么建议吗?
提前致谢
答案 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