我正在制作Nodejs并表示基于应用程序的某些产品的订单可以接受。在这个应用程序中,一旦订单来了,它就被保存到数据库中,然后生成一个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})
})
您所描述的当前解决方案称为长轮询。当PDF链接可用时,你可以考虑使用websockets将其推送到前端。
经过一番研究,我发现有两种方法可以解决这个问题
-
正如@Dustin Mackenzie所说,使用web套接字是一个完全有效的解决方案,但对于只有一部分应用程序,我需要做很多事情,比如安装套接字。Io/实现我自己的web套接字。然后管理客户端以及web套接字。
-
使用服务器发送的事件,这是非常容易的,它不需要我使用任何特定的库。它有非常广泛的浏览器支持,实现它就像在发送响应和使用res.write()时设置内容类型头一样简单,遵循特定的语法
根据文档,您不允许对单个请求发送多个响应。
请使用res.write(),将解决您的问题。这是nodejs内部函数。
有关res.write函数的更多信息,请参考官方文档。
您不能对一个请求响应两次。你需要把你的回答组合成一个单一的回答。例如:
res.json({
msg : 'order saved',
pdfLink : pdf.link
})