【发布时间】:2020-11-22 18:54:15
【问题描述】:
在下面的代码中,csv2pg 函数是异步的
const postUsages = async (req: MulterRequest, res: Response, next: any) => {
try {
const result = await csv2pg(req, next);
res.status(200).json({
msg: 'File uploaded/import successfully!',
file: req.file,
});
} catch (err) {
res.status(400).json({
msg: 'File uploaded/import failed!',
file: req.file,
});
}
};
问题是,在返回 res.status(200) 之前,await 似乎没有等待函数完成
这里是被调用的 csv2pg 函数的内容(这段代码中的异步位是 forEach 和 pool.query)
const csv2pg = (req: MulterRequest, next: any): any => {
let provider_id = req.body!.provider_id;
const filePath = appRoot + '/reports/' + req.file.filename;
const stream = fs.createReadStream(filePath);
const csvData: any[] = [];
const csvStream = csv
.parse()
.on('data', (data: any) => {
csvData.push(data);
})
.on('error', (err: any) => {
throw err.message;
})
.on('end', () => {
csvData.shift();
csvData.forEach((row) => {
pool.query(
`INSERT INTO usage (date_and_time, consumption, reading_quality, provider_id)
VALUES ((TO_TIMESTAMP($1, 'DD/MM/YYYY HH24:MI') AT TIME ZONE 'Australia/Melbourne')::TIMESTAMP WITH TIME ZONE, $2, $3, ${provider_id})`,
row,
(err: any) => {
if (err) {
next(new Error(err));
}
}
);
});
fs.unlinkSync(filePath);
});
stream.pipe(csvStream);
};
另一个问题是,当出现问题时,顶部会显示另一条错误消息,表明标头已设置(当然,此时服务器已经返回给客户端)
理想情况下,当出现错误时,整个函数应该停止,返回错误消息,并等待新的传入请求
【问题讨论】:
-
问题是在 forEach 循环中运行异步代码,检查这个答案stackoverflow.com/a/63618100/11531708
-
您的 csv2pg 函数是一个耗时的函数。所以你最好使用一个承诺。猜测解决会解决你的问题。
-
@MohammedAmirAnsari 这只能部分解决问题,因为 poo.query 是另一个异步函数
标签: node.js typescript async-await