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