Промежуточное ПО на основе ролей пользователей возвращает соответствующий код состояния ответа HTTP - PullRequest
0 голосов
/ 30 августа 2018

Я создаю промежуточное ПО для 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 голосов
/ 30 августа 2018

Как предлагается в комментариях. Вы можете отклонить с пользовательской ошибкой, как это:

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();
  })
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...