【问题标题】:Calling next('route') when no other route matches the request uri当没有其他路由匹配请求 uri 时调用 next('route')
【发布时间】:2016-07-31 19:29:01
【问题描述】:

Express 文档中关于next('route') 回调的说明如下:

您可以提供多个回调,并且所有回调都被平等对待,并且表现得就像中间件一样,除了这些回调可能会调用 next('route') 来绕过剩余的路由回调。您可以使用此机制对路由执行前置条件,然后在没有理由继续匹配路由时将控制权传递给后续路由。

要跳过路由器中间件堆栈中的其余中间件函数,请调用 next('route') 将控制权传递给下一个路由。注意:next('route') 仅适用于使用 app.METHOD() 或 router.METHOD() 函数加载的中间件函数。

中间件调用next('route')没有其他匹配路由时,客户端的响应是什么?

【问题讨论】:

    标签: express


    【解决方案1】:

    它将退出 Router 并继续处理应用程序的其余部分 middleware,如果仍然没有以 response 结尾,则将引发 404 错误并由错误处理程序处理。

    【讨论】:

    • 啊,好吧。如果我没有指定错误处理程序,默认错误处理程序会响应什么?
    • 既然你用express 标记了这个问题,我包括了最后一位,因为默认情况下错误处理中间件包含在Router 中间件之后。从本质上讲,它只会离开路由器并移动到下一个应用程序中间件(这就是您在 app.use 中看到的),不管它发生了什么。
    【解决方案2】:

    对客户端的响应是状态 404 错误。这不会被路由器错误处理程序捕获。

    如果您出于某种原因想要捕获 404 错误,请参阅this 问题。

    但要注意匹配路线:

    router.get('/profile', auth.hasRole('User'), controller.showProfile);
    router.get('/:id', controller.show);
    

    如果客户端没有该角色,我有 hasRole('User') 函数调用 next('route')。然后将 Controll 传递给 '/:id' 路由,因为这与请求 uri 匹配,从而导致错误。

    【讨论】:

    • 如果您的应用程序中有错误处理程序可以捕获未返回响应的路由器,则只有 404。您可以通过在路由器之后添加一些中间件来测试这一点,这些中间件会返回您选择的特定错误代码和一些 HTML 来验证这一点。这正是 ExpressJS 项目默认设置的方式(错误处理中间件就在应用程序中的路由器之后)。我在回答中指定说它是应用程序错误处理程序,而不是路由器(除非您提供它们,否则没有)。
    • 不,无论如何都是 404。我是说你不能在应用程序堆栈中的任何地方提供一个错误处理程序(一个具有 4 个参数的函数:err、req、res、next),当没有其他匹配的路由时,它将捕获调用 next('route') 的错误.我相信这是正确的。但我猜你的意思是我可以在我的路由器堆栈的末尾添加一个路由处理程序(一个具有 3 个参数的函数:req、res、next),它以错误响应。然后只有在没有其他路由处理程序响应请求时才会调用它。
    • 好点,是的,我指的是在路由之后创建您自己的“错误处理程序”并从那里制作您的响应。好答案。基本上归结为将尝试所有中间件,如果没有返回响应,则会抛出 404 错误。我已经更新了我的答案,使其更加明确和简洁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2013-09-24
    相关资源
    最近更新 更多