如何在带有 fast-csv 的 express.js 中同时使用 async/await 和 .on()?

问题描述

我已经设置了一个路径来上传 .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'...) 部分之外的 existRowsfileRows 数据并使用它们在 on.('end'...) 部分。

我认为这一定是我如何在其中设置异步/等待的问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)