首页 > 解决方案 > res.send 令牌然后重定向

问题描述

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

这个 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()

标签: javascriptnode.jsexpress

解决方案


您不能及时将多个响应发送回客户端。你得到一个 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以获取最终数据。


推荐阅读