如何在Koa中间件中传递参数?

时间:2018-12-10 08:17:08

标签: koa koa2 koa-router

所以我在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 :(得分:0)

您的中间件看起来不错,bugfix是什么?

此外,由于您使用的是combine,因此您不需要它。

koa-router

答案 1 :(得分:0)

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

exports.requireRole = role =>

代替

exports.requireRole = async role =>

我本人正在研究中间件,并且也遇到了这个问题。