如何终止路由中间件链?

Posted

技术标签:

【中文标题】如何终止路由中间件链?【英文标题】:How to terminate route middleware chain? 【发布时间】:2019-07-24 04:38:13 【问题描述】:

我有一个带有身份验证中间件的简单 Express 路由器设置。我有类似下面的代码。

如果用户使用不正确的凭据导航到“/authenticate”,我希望中间件发送错误响应并停止所有中间件和路由处理。为此,我发送了一个响应,告诉 Express 跳过带有 next('route') 的路由中间件的其余部分,并返回以停止处理 authMiddleware 函数。

let router = express.Router()

function authMiddleware(req, res) 
    //Do some authentication checks
    if(!authenticated) 
        res.status(403).send("Could not authenticate. :-(")
        next('route')
        return
    

    //Additional authentication checks


router.use(authMiddleware)

router.post('/authenticate', (req, res)=> 
    res.send("You should not see me if you aren't authenticated!")

我希望 post 路线不会运行;但是,它确实给了我错误[ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client。我搜索了 Google、Stack Overflow 和 Express 文档,但都无济于事,尽管可能缺少我的搜索词。

我看到一篇 Scotch 文章建议进行重定向,但这似乎有点生硬和不雅。

所以我的问题是:终止中间件/路由链的正确方法是什么?

【问题讨论】:

【参考方案1】:

要终止中间件和路由链,只需调用next()

function authMiddleware(req, res, next) 
    let authenticated = false;

    if(!authenticated) 
        res.status(403).send("Could not authenticate. :-(");

        // do not call next(), and simply return

        return;
    

    //Additional authentication checks

    // all passed, let's pass it to next()
    next();

【讨论】:

就是这么简单……没想到!非常感谢。

以上是关于如何终止路由中间件链?的主要内容,如果未能解决你的问题,请参考以下文章

go-gin-api 路由中间件 - 捕获异常

从快速中间件中排除路由

Go语言经典库使用分析| Negroni 中间件

[系列] go-gin-api 路由中间件 - Jaeger 链路追踪

Gin简单明了的教程---下

如何使用 express 中间件处理所有路由?