【问题标题】:Async with redirecting routes in Express与 Express 中的重定向路由异步
【发布时间】:2020-12-05 00:37:07
【问题描述】:

我正在使用 Node.js/Express 构建一个 Web 应用程序。我有一条路线,其唯一功能是重定向到另一条路线。这条其他路线是异步的。我想知道原始路线是否也需要异步。例如,

router.get('/routeA', (req, res) => {
  res.redirect('/routeB');
});

router.get('/routeB', async (req, res) => {
  // Async code
});

这种情况下,routeA中间件函数是否需要异步:

router.get('/routeA', async (req, res) => {
  res.redirect('/routeB');
});

我是新手...

【问题讨论】:

    标签: node.js express async-await


    【解决方案1】:

    我想知道原始路由是否也需要异步

    不,它没有。这两条路线其实并没有什么关系,完全是分开的。

    您提出这个问题的事实表明您并不确定重定向会发生什么,因此我将对此进行解释,然后就会清楚为什么您的问题的答案是这样的。

    以下是客户端请求路由 /routeA 时发生的一系列事件:

    1. 客户端请求/routeA
    2. 服务器接收该请求并将其与您的特定路由处理程序相匹配。
    3. 该路由处理程序调用res.redirect('/routeB');
    4. 该函数调用将 302 http 响应发送回客户端,并将 Location: 标头设置为 /routeB
    5. 您的服务器现在已完成第一个请求。
    6. 客户端收到来自原始请求的 302 响应,发现它是 302 响应并从该响应中获取 Location 标头。
    7. 如果客户端想要遵循该重定向,那么它会向同一主机发出一个新请求,请求 /routeB
    8. 您的服务器收到/routeB 的新请求。
    9. 您的服务器运行其异步代码,然后(可能)将响应发送回客户端。
    10. 客户端接收该响应并对其进行处理。

    所以,您应该在这里看到的第一件事是,从服务器的角度来看,/routeB 的第二个请求与第一个请求完全没有关系。对/routeA 的第一个请求已经完全完成。然后,一段时间后,第二个/routeB 请求到达。这可能会或可能不会响应重定向,服务器并不真正关心。其他客户可能只是直接请求/routeB

    所以,它不像 routeA 正在调用 routeB。这与一个异步函数调用另一个异步函数的常规函数​​调用不同。


    这里有点类比。当您的朋友 Bob 从家里给您打电话时,您正在国外旅行。因为您正在旅行,所以这对 Bob 来说是一个长途电话,并且他会为此电话收取费用。但是,鲍勃给你打电话的目的是他想让你给他杰克的电话号码(杰克是家里的另一个朋友)。你高兴地向他提供了杰克的电话号码,然后你的电话就结束了。

    现在,鲍勃用你给他的电话号码给杰克打电话。由于 Bob 和 Jack 都在同一个城市,所以这不是本地电话,因此该电话不收取任何服务费。

    与重定向一样,一旦您将 Jack 的电话号码提供给 Bob 并完成通话,您的通话就完成了。 Bob 之后对该电话号码所做的事情(有点像重定向)与您无关,也与您的原始呼叫无关。 Bob,然后打了一个全新的电话联系 Jack。

    这个类比中的电话号码就像请求路径。服务器就像本地电话公司。 Bob 的每个调用都是完全独立的,彼此之间没有任何关系,就像两个客户端对您的服务器的请求是完全独立的一样。

    【讨论】:

      【解决方案2】:

      TLDR:没有。

      res.redirect 重定向到从指定路径派生的 URL,具有指定状态,对应于 HTTP 状态代码的正整数。如果未指定,状态默认为“302“找到”。请查看链接了解更多info

      【讨论】:

        猜你喜欢
        • 2018-06-10
        • 1970-01-01
        • 2018-01-29
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 2017-10-07
        • 2021-12-14
        • 2021-11-08
        相关资源
        最近更新 更多