【发布时间】:2021-09-14 02:11:55
【问题描述】:
我正在使用fs.createReadStream 读取上传的 csv 文件数据。当收到数据行时,我正在验证这些数据并将验证数据推送到数组中。
问题是,它在调用end 后收到最后一行。
我已使用四行的 csv 进行波纹管测试。所有四条记录均通过验证。
const stream = fs.createReadStream(filePath)
.pipe(csv.parse({ headers: true }))
.on("error", (error) => {
throw error.message;
})
.on("data", async (row) => {
try {
stream.pause();
const mobile = Helper.validateMobile(row.Telephone)
const validationerrors = await Helper.ValidateCustomer(null, mobile, row.code, "BULK");
console.log(`validationerrors ---> ${validationerrors} Telephone--> ${row.Telephone}`)
if (validationerrors.length) {
throw validationerrors.message
} else {
csvData.push(row);
}
} finally {
stream.resume();
}
})
.on("end", async () => {
console.log("ENDDD ---->", csvData)
});
Console.log 输出是这样的。最后一行(777223478 行)在on("end") 调用后接收。
validationerrors ---> Telephone--> 778786516
validationerrors ---> Telephone--> 718254596
validationerrors ---> Telephone--> 712760763
ENDDD ----> [
{
Code: 'CTLD000323',',
Telephone: '778786516' },
{
Code: 'CTLD000324',
Telephone: '718254596' },
{
Code: 'CTLD000376',
Telephone: '712760763' }
]
validationerrors ---> Telephone--> 777223478
【问题讨论】:
-
我想知道是不是因为
.pipe(),因此您可能没有暂停正确的流,或者CSV模块没有正确尊重.pause()?您使用的是 NPM 上的哪个 csv 模块,以便我们查看它的代码和文档? -
@jfriend00 我正在使用 npmjs.com/package/multer 。也跟着这个例子github.com/dabelsare/upload-csv-into-node-server/blob/master/…
-
Multer 不是您的 csv 实现。该示例使用
const csv = require('fast-csv');。你用的是这个吗? -
是的,它正在使用内部管道,例如
.pipe(csv.parse({ headers: true }))) -
在我看来,您使用的 csv 解析器不正确支持
.pause(),即使您暂停了流,它也会继续向您发送缓冲区中已处理的行。我能想到的是,当您想暂停时,您必须缓冲data事件,并且在您准备好之前不要处理它们。
标签: node.js async-await stream