Как передать параметр в промежуточное ПО Коа?
Так что у меня есть эта функция в 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);