Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.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
Javascript 路由和路由处理程序之间的函数未按预期执行_Javascript_Node.js_Express - Fatal编程技术网

Javascript 路由和路由处理程序之间的函数未按预期执行

Javascript 路由和路由处理程序之间的函数未按预期执行,javascript,node.js,express,Javascript,Node.js,Express,我正在尝试编写API,其中一些API具有基于角色的授权。此外,我正在使用JWT对我的API进行身份验证 下面是代码,我正在尝试编写。然而,当我点击“/user/:email”端点时,并没有调用authorize函数。始终会调用getUser函数。我假设首先应该调用authorize函数,然后调用getUser 有人能告诉我为什么在我点击“/user/:email”端点时未调用authorize函数吗?我怎么会在这里?我如何才能正确处理这种情况 var express = require('exp

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

下面是代码,我正在尝试编写。然而,当我点击“/user/:email”端点时,并没有调用authorize函数。始终会调用getUser函数。我假设首先应该调用authorize函数,然后调用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); 

authorize
在应用程序启动时调用,而不是在您点击“/user/:email”时调用。调用
authorize('Admin')
只返回undefined,这不会导致执行
console.log
,也不会在点击“/user/:email”时执行

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

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

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

我想说,您的中间件只是返回数组中的一些函数。这些支架是strange@Rashomon:如果我删除authorize函数中的方括号,我将得到一个编译器/解释器错误,即“error:Route.get()需要回调函数,但得到了一个[object Undefined]”。在某种程度上,您是正确的,我必须对一个路由按顺序应用多个回调。但我怎样才能做到这一点呢?如何将“Admin”角色传递给回调函数authorize?@Sreehari-抱歉,将角色从请求传递给身份验证方法有什么意义?不应该从经过身份验证的用户读取角色吗?在这种情况下,您将在获取user@Milan:我的角色有“管理员”、“客户”、“合作伙伴”。身份验证只是对所有类型的用户进行身份验证,并生成JWT令牌。现在,一些路由只能由“管理员”访问。所以我需要在执行路由处理程序之前授权用户。那么我该怎么做呢?@Sreehari-如果您想检查某个JWT令牌的用户是否具有特定权限,您可以尝试将
express JWT permissions
软件包与
express JWT
@Milan:谢谢米兰。expressjwt权限似乎是一个好的权限。我试试这个。