node.js - 发送流作为 axios 请求的响应

标签 node.js reactjs

我正在向服务器发出 .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返回一个新的 Promise 数组,您可以使用 Promise.all 等待它。

const promises = data.map(async data => {
  // ...
})

// wait for all the promises to resolve
await Promise.all(promises)

res.send(responsePDF)

但请注意,这会“并行”运行 map 。无法保证 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)

关于node.js - 发送流作为 axios 请求的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60504901/

相关文章:

javascript - 我应该在react-redux应用程序中的哪里存储非UI数据?

javascript - 防止 useEffect 在初始渲染时触发

javascript - 开 Jest 模拟 aws-sdk ReferenceError : Cannot access before initialization

node.js - 为什么远程服务器响应在获取请求后不包含 nodejs 上的 x-csrf-token?

javascript - 在 Material-UI TableCell 中格式化日期字符串

json - 如何在 React 组件中访问 JSON?

reactjs - 如何将自定义组件传递给 MUI 工具提示中的标题 Prop ?

node.js - 使用 GridFSBucket 删除 .files 和 .chunk

javascript - 如何在 Node js中获取客户端计算机名称

javascript - Webpack 退出监视模式