Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 第二个中间件仅在route方法之后调用_Node.js_Express - Fatal编程技术网

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

Node.js 第二个中间件仅在route方法之后调用,node.js,express,Node.js,Express,我有两个中间件,一个检查用户是否有有效的令牌,另一个检查用户是否有权限。问题是,在调用第一个中间件之后,程序将直接进入我的路由方法,而不是调用第二个中间件。这是我的代码: app.use(function(req, res, next) { checkToken(req, res, next); checkPermission(req, res, next); }); app.post("/test", (req, res) => { console.log("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");
}
我得到的输出:

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

我期望的输出:

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

我想让我的程序做的是,在进入我的路由方法之前,检查用户是否拥有有效的令牌以及他是否拥有权限


这样做对吗

每个express中间件都有一个
next
回调来触发下一个中间件,但是在这里,您在中间件内部调用了两个函数,它们在每个方法中调用
next
。你必须像这样重构你的代码

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

app.post("/test", (req, res) => {
  console.log("route");
});
...
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");
}
app.use(checkToken);// 另请参见,以更好地了解中间件的工作方式

/* 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");
});