基于用户角色的中间件返回适当的HTTP响应状态代码

时间:2018-08-30 17:56:04

标签: node.js express

我正在为admin用户创建中间件:

let admin_middleware = (req, res, next) => {
    let token = req.header('x-auth');

    User.findByToken(token).then((user) => {
        if(!user || user._doc.user_type !== user_roles.admin)
            return Promise.reject();

        req.user = user;
        req.token = token;
        next();
    }).catch((e) => {
        res.status(401).send();
    })
};

问题在于以下代码行:

if(!user || user._doc.user_type !== user_roles.admin)
        return Promise.reject();

admin_middleware中使用server.js时,我得到了被拒绝的承诺:

.catch(e => {
    res.status(401).send();
})

这意味着对于用户not authorized和“禁止访问”,我都返回401状态代码。

我想在一种情况下返回403,在另一种情况下返回401。解决办法是什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

如评论中所建议。您可以这样拒绝自定义错误:

class UnauthorizedError extends Error {}
class ForbiddenError extends Error {}

let admin_middleware = (req, res, next) => {
  let token = req.header('x-auth');

  User.findByToken(token).then((user) => {
    if (!user) return Promise.reject(new UnauthorizedError());
    if (user._doc.user_type !== user_roles.admin) return Promise.reject(new ForbiddenError());

    req.user = user;
    req.token = token;
    next();
  }).catch((e) => {
    if (e instanceof  UnauthorizedError) {
      res.status(401);
    } else if (e instanceof ForbiddenError) {
      res.status(403);
    } else {
      res.status(500);
    }
    res.send();
  })
};