Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何为单个请求多次发送数据_Javascript_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Javascript 如何为单个请求多次发送数据

Javascript 如何为单个请求多次发送数据,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我正在制作一个基于Nodejs和express的应用程序,在那里可以接受某些产品的订单。在该应用程序中,一旦收到订单,就会将其保存到数据库中,然后生成pdf作为订单收据。生成pdf需要一些时间,因此我会在订单保存在数据库中后立即将数据发送给用户。但“下订单”页面上有一个表,其中显示了所有以前的订单。由于pdf是在向用户发送响应后生成的,因此我必须不断轮询服务器,以检查是否下了任何未优化的新订单。那么,有没有一种方法可以再次向同一个请求发送响应呢 //import Order model app

我正在制作一个基于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}) 

})

您不能对一个请求响应两次。你需要将你的回答组合成一个单一的回答。例如:

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

您所描述的当前解决方案称为长轮询。您可能会考虑使用WebSooSt将PDF链接推到前端,当它可用时。

根据文档,您不允许向单个请求发送多个响应。 使用res.write(),将解决您的问题。 这是nodej的内部功能


有关res.write函数的更多信息,请参考官方信息。

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

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

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


  • 正如我前面所说,创建pdf需要一些时间,所以我不希望用户等待那么久。这就是为什么我会问这个问题。在这种情况下,如果pdf生成支持流式传输,那么可以将输出流直接传输到响应。用户将在pdf生成开始时收到它。res.write可以工作,但问题是,当我使用res.end()时,响应将反映在客户端,因此用户将不得不等待同样长的时间。我所描述的当前解决方案称为短轮询,长轮询是向服务器发送请求并保留它。你可以在这里读到