这是我的路由器:
router.post('/post', isAccess, controller.create)
字符串
IsAccess中间件:
exports.isAccess=(request, result, next)=>{
const userid='64c1248482bcfbb533b366d5'
User.findOne({_id:userid}).select({role:1}).then(user=>{
if(!role==='routerRoleResource'))
{ const error=new Error('Authorization failed'); error.status=401; throw error }
}).
catch(err=>{
if(!err.statusCode) err.statusCode=500;
next(err)
})
next()
}
型
虽然它在控制台中生成了一个错误,但它并没有停止路由中的处理,controller.create
仍然被调用。如果我删除了catch并只有这个,我会得到以下错误:
exports.isAccess=(request, result, next)=>{
const userid='64c1248482bcfbb533b366d5'
User.findOne({_id:userid}).select({role:1}).then(user=>{
if(!role==='routerRoleResource'))
{ const error=new Error('Authorization failed'); error.status=401; throw error }
})
next()
}
型
的数据
我试过使用async await,但也遇到了同样的问题。但是,如果我有以下情况:
exports.isAccess=(request, result, next)=>{
const error=new Error('Authorization failed');
error.status=401;
throw error
next()
}
型
它在Postman中运行得很好:
的
但是,如果我只是输入async关键字(exports.isAccess=async(request, result, next)
),它就会停止工作并生成错误。由于某种原因,错误模块无法与async或promise一起工作。有人能给我指个正确的方向吗?
1条答案
按热度按时间mlmc2os51#
中间件不停止路由中的处理并允许调用controller.create的原因是User.findOne()方法的异步特性。在isAccess中间件的第一个版本中,next()函数在.then()块之外调用,这意味着它将在User.findOne()操作完成之前执行,因此,在抛出错误之前执行。
要解决这个问题,您需要将next()函数移动到.then()块中,这样它只会在异步操作完成后被调用。此外,if语句还有一个小的语法问题。你应该改变如果(!role = 'routerRoleResource')到if(user.role!== 'routerRoleResource')。请尝试此中间件的更正版本,
字符串