Javascript 如何为单个请求多次发送数据
我正在制作一个基于Nodejs和express的应用程序,在那里可以接受某些产品的订单。在该应用程序中,一旦收到订单,就会将其保存到数据库中,然后生成pdf作为订单收据。生成pdf需要一些时间,因此我会在订单保存在数据库中后立即将数据发送给用户。但“下订单”页面上有一个表,其中显示了所有以前的订单。由于pdf是在向用户发送响应后生成的,因此我必须不断轮询服务器,以检查是否下了任何未优化的新订单。那么,有没有一种方法可以再次向同一个请求发送响应呢Javascript 如何为单个请求多次发送数据,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我正在制作一个基于Nodejs和express的应用程序,在那里可以接受某些产品的订单。在该应用程序中,一旦收到订单,就会将其保存到数据库中,然后生成pdf作为订单收据。生成pdf需要一些时间,因此我会在订单保存在数据库中后立即将数据发送给用户。但“下订单”页面上有一个表,其中显示了所有以前的订单。由于pdf是在向用户发送响应后生成的,因此我必须不断轮询服务器,以检查是否下了任何未优化的新订单。那么,有没有一种方法可以再次向同一个请求发送响应呢 //import Order model app
//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函数的更多信息,请参考官方信息。经过一些研究,我发现有两种方法可以解决这个问题
正如我前面所说,创建pdf需要一些时间,所以我不希望用户等待那么久。这就是为什么我会问这个问题。在这种情况下,如果pdf生成支持流式传输,那么可以将输出流直接传输到响应。用户将在pdf生成开始时收到它。res.write可以工作,但问题是,当我使用res.end()时,响应将反映在客户端,因此用户将不得不等待同样长的时间。我所描述的当前解决方案称为短轮询,长轮询是向服务器发送请求并保留它。你可以在这里读到