所以我在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);
但是随后我收到一条错误消息:
中间件必须是函数而非对象
仅当我尝试将参数传递给它时,才会发生这种情况。
我在这里做什么错了?
答案 0 :(得分:0)
您的中间件看起来不错,bugfix
是什么?
此外,由于您使用的是combine
,因此您不需要它。
koa-router
答案 1 :(得分:0)
您遇到的问题是由于Promises是对象,而异步函数返回Promises。您需要将初始功能更改如下:
exports.requireRole = role =>
代替
exports.requireRole = async role =>
我本人正在研究中间件,并且也遇到了这个问题。