【问题标题】:How to send data more than once for a single request如何为单个请求多次发送数据
【发布时间】:2021-06-06 00:04:39
【问题描述】:

我正在制作一个基于 Nodejs 和 express 的应用程序,可以在其中接受某些产品的订单。在该应用程序中,一旦收到订单,就会将其保存到数据库中,然后生成一个 pdf 作为订单收据。生成 pdf 需要一些时间,因此我会在订单保存在数据库中后立即将数据发送给用户。但是在下订单页面上有一个表格,其中显示了所有以前的订单。由于 pdf 是在向用户发送响应后生成的,因此我必须不断地轮询服务器以检查是否下达了根本没有优化的新订单。那么有没有办法再次向同一个请求发送响应。这是我想要实现的代码表示

//import Order model

app.post('/',async (req,res)=>{
      
let order = new Order(//data from req obj)
await order.save();
res.json({msg : 'order saved'});
//generate pdf and save it on cloud
res.json({pdfLink : pdf.link}) 

})

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    您所描述的当前解决方案称为长轮询。您可以考虑在 PDF 链接可用时使用 websockets 将其推送到前端。

    【讨论】:

    【解决方案2】:

    经过一番研究,我发现有两种方法可以解决这个问题

    1. 正如@Dustin Mackenzie 所说,使用网络套接字是一种完全有效的解决方案,但对于应用程序的一部分,我需要做很多事情,比如自己安装 socket.io/implement web 套接字。然后管理客户端以及 Web 套接字。

    2. 使用服务器发送的事件非常简单,并且不需要我使用任何特定的库。它具有非常广泛的浏览器支持,实现它就像在发送响应和使用 res.write() 时设置内容类型标头一样简单,遵循特定的语法

    【讨论】:

      【解决方案3】:

      根据文档,您不能对单个请求发送多个响应。

      而不是使用 res.write(),将解决您的问题。 是nodejs的内部函数。

      更多res.write功能请关注官方documentation

      【讨论】:

      • res.write 有效,但问题是当我使用 res.end() 时响应将反映在客户端,因此用户将不得不等待同样长的时间。
      【解决方案4】:

      您不能对一个请求做出两次响应。您需要将您的回复合并为一个回复。例如:

      res.json({
        msg : 'order saved',
        pdfLink : pdf.link
      })
      

      【讨论】:

      • 正如我之前所说,创建 pdf 需要一些时间,所以我不希望用户等待那么久。这就是我问这个问题的原因
      • 在这种情况下,如果 pdf 生成支持流式传输,您可以将输出流直接通过管道传输到响应。用户将在 pdf 生成开始后立即收到它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 2022-06-16
      • 2018-09-16
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多