如何终止路由中间件链?

时间:2019-07-24 04:38:13

标签: node.js express

我有一个带有身份验证中间件的简单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!")
}

我希望发布路线不会运行;但是,确实会出现错误[ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client。我搜索过Google,Stack Overflow和Express文档都没有用,尽管可能缺少搜索词。

我看过一篇苏格兰威士忌的文章,建议做重定向,但这似乎有点不礼貌和雅致。

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

1 个答案:

答案 0 :(得分:2)

要终止中间件和路由链,只需调用$order_items = OrderItem::find() ->where(['location_id' => $model->location_name]) ->andFilterWhere(['instructor_id' => $model->instructor_name]) ->andwhere(['between', 'date', $model->from_date, $model->to_date ]) ->all();

next()