[英]Sending streams as response of a axios request
我正在向服务器发出一个带有.xlsx
文件的请求,服务器正在使用 puppeteer 生成一个 PDF,我想将流以数组的形式发送回客户端以下载它们,但响应并未等待它们,并且在前面我得到一个空数组。
Node.js/Reactjs
router.post('/generate-payslip', async (req, res) => {
const data = JSON.parse(req.body)
let responsePDF = []
data.map(async data => {
responsePDF.push(await generatePayslipPDF(data))
const payslips = await Payslip.findOne({ date: data.Date, name: data.Name })
if (payslips) {
} else {
let payslip = new Payslip({
date: data.Date,
name: data.Name,
data: data
})
payslip = await payslip.save()
}
})
res.send(responsePDF)
})
您需要等待data
映射完成。
您对data.map
调用会返回一个新的data.map
数组,您可以使用Promise.all
等待Promise.all
。
const promises = data.map(async data => {
// ...
})
// wait for all the promises to resolve
await Promise.all(promises)
res.send(responsePDF)
但是请注意,这会以“并行”方式运行地图。 无法保证 PDF 按顺序推送到responsePDF
数组。
为了保证顺序,可以在map函数中返回生成的PDF:
const responsePDF = await Promise.all(data.map(async data => {
// ...
return await generatePayslipPDF(data)
}))
res.send(responsePDF)
或者,您可以使用 for...of 循环连续运行它(一次一个)。 这样你就不需要使用Promise.all
。
for (const payslip of data) {
responsePDF.push(await generatePayslipPDF(payslip))
// ...
}
res.send(responsePDF)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.