1

所以我在 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);

但后来我收到一条错误消息:

中间件必须是函数而不是对象

仅当我尝试将参数传递给它时才会发生这种情况。

我在这里做错了什么?

4

2 回答 2

1

您遇到的问题是由于 Promises 是对象,而异步函数返回 Promises。您需要将初始功能更改为如下:

exports.requireRole = role =>

代替

exports.requireRole = async role =>

我自己正在检查中间件,也遇到了这个问题。

于 2019-01-22T18:44:39.387 回答
0

你的中间件看起来不错,是什么combine

此外,由于您正在使用koa-router它,因此您不需要它。

router.delete('/:id', jwtAuth, requireRole(ROLES.ADMIN), deleteUser);
于 2018-12-17T08:34:51.140 回答