问题描述
我已经设置了一个路径来上传 .csv 文件,验证收到的数据,检查数据库中不存在任何行,最后在执行所有验证检查后上传数据。
以下是有问题的路线:
...
const Customer = require('../models/Customer');
const fs = require('fs');
const multer = require('multer');
const csv = require('fast-csv');
router.post('/customers/csv',upload.single('file'),async (req,res) => {
const errors = [];
const fileRows = [];
const existRows = [];
const count = 1;
fs.createReadStream(req.file.path)
.pipe(csv.parse({ headers: true }))
.validate(data =>
// Data validation for each field...
)
.on('error',error => console.error(error))
.on('data-invalid',(row,rowNumber) =>
{
errors.push(`Invalid [rowNumber=${rowNumber}] [row=${JSON.stringify(row)}]`)
console.log(`Invalid [rowNumber=${rowNumber}] [row=${JSON.stringify(row)}]`)
}
)
.on('data',async function (row) {
if(await Customer.exists({$or: [
{srn: row.srn},{telephone: row.telephone},{claim_id: row.claim_id},{receiver_id: row.receiver_id}
]})) {
// This doesn't store data so long as I'm using async/await
// but I need the await for the mongoose query
existRows.push(row)
} else {
fileRows.push(row) // This doesnt work so long as I'm using async
}
count++;
})
.on('end',(rowCount) => {
fs.unlinkSync(req.file.path);
if(errors.length !== 0) {
req.flash(
'error_msg',`Upload failed! Parsed ${rowCount} rows with ${errors.length} bad rows at rows:`
)
return res.redirect('/admin/customers/csv')
}
if(existRows.length !== 0) {
req.flash(
'error_msg',`Error: ${existRows.length} rows already exist. Kindly edit and try again.`
)
return res.redirect('/admin/customers/csv')
}
fileRows.forEach(async customer => {
//Execute an insertion or save
})
})
})
不幸的是,我似乎无法访问存储在 on.('data'...) 部分之外的 existRows 或 fileRows 数据并使用它们在 on.('end'...) 部分。
我认为这一定是我如何在其中设置异步/等待的问题?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)