繁体   English   中英

发送流作为 axios 请求的响应

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM