Хуки

В 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);
        }
    ]
}

results matching ""

    No results matching ""