NodeJS 路由器异步中间件抛出错误消息

kse8i1jr  于 2023-08-04  发布在  Node.js
关注(0)|答案(1)|浏览(140)

这是我的路由器:

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一起工作。有人能给我指个正确的方向吗?

mlmc2os5

mlmc2os51#

中间件不停止路由中的处理并允许调用controller.create的原因是User.findOne()方法的异步特性。在isAccess中间件的第一个版本中,next()函数在.then()块之外调用,这意味着它将在User.findOne()操作完成之前执行,因此,在抛出错误之前执行。
要解决这个问题,您需要将next()函数移动到.then()块中,这样它只会在异步操作完成后被调用。此外,if语句还有一个小的语法问题。你应该改变如果(!role = 'routerRoleResource')到if(user.role!== 'routerRoleResource')。请尝试此中间件的更正版本,

exports.isAccess = (request, response, next) => {
    const userid = '64c1248482bcfbb533b366d5'
    User.findOne({ _id: userid }).select({ role: 1 })
      .then(user => {
        if (user.role !== 'routerRoleResource') {
          const error = new Error('Authorization failed')
          error.status = 401
          throw error
        }
        // Proceed to the next middleware or the route handler
        next()
      })
      .catch(err => {
        if (!err.statusCode) err.statusCode = 500;
        next(err)
      })
  }

字符串

相关问题