Как передать параметр в промежуточное ПО Коа?

Так что у меня есть эта функция в 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 ответа

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

exports.requireRole = role =>

вместо

exports.requireRole = async role =>

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

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

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

router.delete('/:id', jwtAuth, requireRole(ROLES.ADMIN), deleteUser);
Другие вопросы по тегам