如何终止路由中间件链?
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();
【讨论】:
就是这么简单……没想到!非常感谢。以上是关于如何终止路由中间件链?的主要内容,如果未能解决你的问题,请参考以下文章