路由和路由处理程序之间的功能未按预期执行

时间:2019-03-16 17:51:28

标签: javascript node.js express

我正在尝试编写API,其中一些具有基于角色的授权。此外,我正在使用JWT进行API的身份验证。

下面是代码,我正在尝试编写。但是,当我点击“ / user /:email”端点时,未调用授权功能。总是会调用 getUser 函数。我当时以为,首先应先调用授权功能,然后再调用 getUser

有人可以启发我为什么我点击“ / user /:email”端点时没有调用 authorize 函数吗?我在这里做什么错?我该如何正确处理这种情况?

var express = require('express')
var router = express.Router();
var expressJwt = require('express-jwt');

var authorize = function(role){     
  expressJwt({secret:'secretKey'}, (req, res, next) =>{
    console.log('req.role is', req.role);
    if(req.role === role){
       next();
    }else{
       res.status(403).send({message: 'Unauthorized'});
    }
  })  
}

var getUser = function(req,res,next){
    res.status(200).send("Hello user");
}

router.get('/user/:email', authorize('Admin'), getUser); 

1 个答案:

答案 0 :(得分:1)

authorize是在应用程序启动时调用的,而不是在您单击“ / user /:email”时调用的。调用authorize('Admin')只会返回未定义,这不会导致console.log被执行,也不会在命中“ / user /:email”时发生。

我认为您想要实现的是将多个回调顺序地应用于一条路由。

请参见here

因此,authorize('Admin')应该返回中间件(也称为回调),例如:

return expressJwt({secret:'secretKey'}, (req, res, next) =>{...})