Как передать параметр в промежуточное ПО Коа? - PullRequest
0 голосов
/ 10 декабря 2018

Итак, у меня есть эта функция в Koa, которая в основном проверяет, может ли пользователь получить доступ к определенному маршруту.

exports.requireRole = async role =>
  async (ctx, next) => {
    const { user } = ctx.state.user;
    try {
      const foundUser = await User.findById(user.id);
      // If the user couldn't be found, return an error
      if (!foundUser) {
        ctx.status = 404;
        ctx.body = { errors: [{ error: ERRORS.USER_NOT_FOUND }] };
      } else {
        // Otherwise, continue checking role
        if (getRole(user.role) >= getRole(role)) {
          await next();
        }

        ctx.status = 403;
        ctx.body = { errors: [{ error: ERRORS.NO_PERMISSION }] };
      }
    } catch (err) {
      ctx.throw(500, err);
    }
  };

И я хочу использовать его в качестве промежуточного программного обеспечения:

router.delete('/:id', combine([jwtAuth, requireRole(ROLES.ADMIN)]), deleteUser);

Но тогда я получаю сообщение об ошибке:

промежуточное ПО должно быть функцией, а не объектом

Это происходит только тогда, когда я пытаюсь передать в него аргумент.

Что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Проблема, с которой вы столкнулись, связана с тем, что Promises являются объектами, а асинхронные функции возвращают Promises.Вам необходимо изменить исходную функцию следующим образом:

exports.requireRole = role =>

вместо

exports.requireRole = async role =>

Я сам перебирал промежуточное ПОи тоже столкнулся с этой проблемой.

0 голосов
/ 17 декабря 2018

Ваше промежуточное ПО выглядит нормально, что такое combine?

Кроме того, поскольку вы используете koa-router, оно вам не нужно.

router.delete('/:id', jwtAuth, requireRole(ROLES.ADMIN), deleteUser);
...