重新发送令牌,然后重定向

时间:2020-10-15 03:28:41

标签: javascript node.js express

我有一个Express应用程序,该应用程序在调用get请求时立即返回一个字符串令牌,然后运行一个python代码。一段时间后,python代码会创建一个json文件,我需要在另一个发布请求中发送该文件。

此python代码可能由不同的用户调用,这就是为什么我需要在调用该应用程序后立即为其分配令牌。 在发布请求中,我还将修改json文件,然后将其发送回去

我正在尝试进行res.send令牌,然后res.redirect到发布请求,但是我知道这是不可能的。我还有其他方法可以发送令牌或重定向到发布请求吗?

app.get('/', (req, res) =>{
     res.send(token())
     runPython((code)=>{ 

     *takes around 10 sec*

       res.redirect('/post')}}

app.post('/post', (req, res)=>{

     *do stuff to file*

     res.sendFile()

1 个答案:

答案 0 :(得分:1)

您不能将多个响应及时发送回客户端。您会收到一个http响应。因此,完成res.send(token())后,该http请求即告完成。您不能再发送任何数据作为该http请求的一部分。

在描述事物时,有一些选择:

  1. 将两者合并为一个响应。等待发送令牌,直到您也拥有python响应,然后将它们都以一个JSON响应发送。如果您还要发送回数据,则将无法执行res.redirect()。因此,您可以将重定向位置发送回JSON中,并让客户端手动进行重定向(只需将window.location设置为新的URL)即可。大概在接收端都有客户端Javascript,因为某种形式的代码无论如何都必须接收令牌以对其进行有用的处理。

  2. 使用websocket / socket.io连接进行后续的服务器启动的通信。让客户端连接一个webSocket或socket.io连接。然后,您可以使用令牌进行响应,然后在python完成后,您可以通过websocket或socket.io连接发送其他数据。这将需要额外的代码,以便能够将特定的websocket / socket.io连接与发出此请求的客户端相关联,以便您可以确定该请求的哪个websocket / socket.io连接可以通过其发送通知。

  3. 客户端轮询以完成python操作。让服务器发回令牌并发送某种请求ID,然后客户端每隔几秒钟就可以轮询服务器询问服务器是否已完成针对该请求ID的python操作。当它从服务器收到一条关于python已经完成的响应时,客户端可以手动将其自身重定向到/post以获取最终数据。