与Express中的重定向路由异步



我正在使用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');
});

我是个新手。。。

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

不,它没有。这两条路线实际上毫无关系,完全是分开的。

你问这个问题的事实表明,你真的不确定重定向会发生什么,所以我会解释一下,然后就会清楚为什么你的问题的答案是什么。

以下是客户端请求路由/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和Jack都在同一个城市,所以这不是本地电话,也不收取任何服务费。

在重定向中,一旦你把杰克的电话号码给了鲍勃并完成了通话,你的通话就完全结束了。鲍勃在那之后用那个电话号码做什么(有点像重定向(与你无关,也与你最初的通话无关。鲍勃,然后打了一个全新的电话联系杰克。

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

TLDR:无

res.redirect重定向到从具有指定状态的指定路径派生的URL,该URL是一个与HTTP状态代码相对应的正整数。如果未指定,则状态默认为"302"已找到。请查看链接了解更多信息。

最新更新