Хуки
В Apipie можно добавлять глобальные хуки и хуки для ресурсов.
Apipie использует koa-compose для композиции middleware.
Хуки чаще всего используются в паре с мета информацией ресурсов. Их используют для контроля объекта context
в разный момент испольнения вызова ресурса.
Есть 2 типа хуков:
- Глобальные, которые передаются при создании инстанса Apipie и они выполняются во всех ресурсах, самыми первыми.
- "Локальные" хуки ресурса, которые добавляются в каждый ресурс по отдельности.
Примеры использования.
const authService = async (ctx, next) => {
if (ctx.meta.auth) {
ctx.options.headers = {
[headerAuthorization]: getTokenForAxios(), // подставляем токен авторизации в headers запроса.
};
}
// До вызова next() в ctx.response не доступен, потому, что цепочка еще не дошла до axios.
await next();
// После вызова, axios добавляет результаты работы в ctx.response и уже работать с ними и проверять.
const response = ctx.response;
if (response.error && response.error.message === 'ClientNotAuthorized') {
dropToken();
logout();
}
};
const api = createApi(resources, axios, {
hooks: [ authService ]
}
Здесь показан пример простого сервиса авторизации, который перед отправкой проверяет в мета информации, что ресурсу нужна авторизация и добавляет нужные хедеры в настройки для axios, а потом после получения ответа, проверятся не токен на валидность и если сервер объявляет токен "протухшим", то мы удаляем токен с клиента и деавторизуем его.
Глобальные хуки
Добавляются перед выполнением метода .create()
, после глобальные хуки уже не добавить. Пока добавлять их динамически и после выполнения метода .create()
нельзя. Добавить хук можно через метод globalHook() или же сразу передать массив хуков в hooks
при создании инстанса
Глобальные хуки выполняются в самом начале и в самом конце.
const hooks = [ hook1, hook2, hook3 ]
const apipie = new Apipie(routes, { axios, hooks });
Хуки ресурса
Хуки которые добавляются в каждый ресурс по отдельности. Так же передается массив хуков в свойство hooks
.
Они выполняются после глобальных хуков и перед глобальным.
{
name: 'foo',
get: '/bar',
hooks: [
async (ctx, next) => {
console.log('Context', ctx);
}
]
}