【问题标题】:Sending streams as response of a axios request发送流作为 axios 请求的响应
【发布时间】:2020-03-03 10:14:43
【问题描述】:

我正在向服务器发出带有.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)
})

【问题讨论】:

标签: node.js reactjs


【解决方案1】:

您需要等待data的映射完成。

您对data.map 的调用会返回一个新的承诺数组,您可以使用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)

【讨论】:

    猜你喜欢
    • 2018-04-14
    • 2016-08-13
    • 1970-01-01
    • 2023-03-15
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多