仅在route方法之后调用第二个中间件

时间:2018-10-06 17:23:22

标签: node.js express

我有2个中间件,一个中间件检查用户是否具有有效的令牌,第二个中间件检查用户是否具有权限。问题在于,在调用第一个中间件之后,程序将直接进入我的route方法内部,而不是调用第二个中间件。这是我的代码:

app.use(function(req, res, next) {
  checkToken(req, res, next);
  checkPermission(req, res, next);
});

app.post("/test", (req, res) => {
  console.log("route");
})

function checkToken(req, res, next){
  console.log("check token");
  if(validToken())
    next();
  else
    res.send("no valid token");
}

function checkPermission(req, res, next){
  console.log("check permission");
  if(permission())
    next();
  else
    res.send("no permission");
}

我得到的输出:

  

检查令牌->路线->检查权限

我期望的输出:

  

检查令牌->检查权限->路线

我希望我的程序要做的是在进入我的route方法之前检查用户是否具有有效的令牌以及他是否具有权限!

这是正确的方法吗?

3 个答案:

答案 0 :(得分:2)

app.use(checkToken);
app.use(checkPermission);

app.post("/test", (req, res) => {
  console.log("route");
});
...

答案 1 :(得分:1)

每个快速中间件都有一个next回调函数来触发下一个中间件,但是在这里,您正在中间件内部调用两个函数,每个函数都调用next。您必须像这样重构代码,

app.use(checkToken);  // <== first middleware
app.use(checkPermission) // <== Second middleware

app.post("/test", (req, res) => {
    console.log("route");
})

function checkToken(req, res, next) {
    console.log("check token");
    if (validToken())
        next();
    else
        res.send("no valid token");
}

function checkPermission(req, res, next) {
    console.log("check permission");
    if (permission())
        next();
    else
        res.send("no permission");
}

答案 2 :(得分:1)

另请参阅Writing middleware for use in Express apps,以更好地了解中间件的工作方式。

/* Check token */
function checkToken(req, res, next) {
  console.log("check token");
  if(validToken())
    next();
  else
    res.send("no valid token");
}

/* Check permission */
function checkPermission(req, res, next) {
  console.log("check permission");
  if(permission())
    next();
  else
    res.send("no permission");
}

/* Calling the middleware in right order */
app.use(checkToken, checkPermission, (req, res, next) => {
  next();
});

/* Finally our route */
app.post("/test", (req, res) => {
  console.log("route");
});