Функция абстрагирования промежуточного программного обеспечения - PullRequest
0 голосов
/ 21 мая 2019

Итак, я обнаружил, что у меня есть повторный код для функций промежуточного программного обеспечения Express.

Первая функция:

const isAdmin = async (req, res, next) => {
  try {
    const requestingUser = await knex('users')
                                  .first('current_role')
                                  .where('id','=',req.user.id)

    requestingUser.current_role !== 'admin' ? res.sendStatus(403) : next()

  } catch (error) {
    res.send({error})
  }
}

Вторая функция:

const isAdminOrRecruiter = async (req, res, next) => {
  try {
    const requestingUser = await knex('users')
                                  .first('current_role')
                                  .where('id','=',req.user.id)
    const isNotAllowed = requestingUser.current_role !== 'admin' && requestingUser.current_role !==  'recruiter'
    isNotAllowed ? res.sendStatus(403) : next()

  } catch (error) {
    res.send({error})
  }
}

Мой вопроскак я могу сделать одну абстрактную функцию, такую ​​как isAllowed(['admin]), чтобы только администратор мог пройти, или isAllowed(['admin','recruiter']), чтобы она могла разрешить только администраторам и рекрутерам проходить?

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

1 Ответ

1 голос
/ 21 мая 2019

Вы можете использовать функции более высокого порядка для получения ваших текущих. У вас будет функция, которая принимает список ролей и возвращает другую функцию, которая использует этот список ролей, чтобы проверить, назначен ли текущий пользователь какой-либо из них и, если это так, разрешить доступ:

const isRole = (...roles) => async (req, res, next) => {
  try {
    const requestingUser = await knex('users')
                                  .first('current_role')
                                  .where('id','=',req.user.id)
    const isAllowed = roles.some(role => role == requestingUser.current_role);
    isAllowed ? next() : res.sendStatus(403) 

  } catch (error) {
    res.send({error})
  }
}

const isAdmin = isRole("admin");
const isAdminOrRecruiter = isRole("admin", "recruiter");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...