Архитектура
АрхитектураРазделение запрошенных и исполняемых queries

Разделение запрошенных и исполняемых queries

Gato GraphQL использует конвейер директив — архитектуру, которая позволяет движку сервера разрешать, валидировать и выполнять query. Чтобы сделать движок максимально простым, каждое действие, связанное с разрешением query, происходит внутри конвейера через директивы.

Конвейер директив

Вызов резолвера для валидации и разрешения поля, а также объединение его вывода в ответ, осуществляется с помощью пары специальных директив: @validate и @resolveValueAndMerge. Эти директивы относятся к особому типу: их добавляет не приложение (ни в query, ни в схему), а сам движок. Эти 2 директивы являются неявными и добавляются всегда — к каждому полю каждого query.

Из этой стратегии можно увидеть, что при выполнении query на GraphQL-сервере фактически задействованы 2 queries:

  • Запрошенный query
  • Исполняемый query

Исполняемый query — тот, который в конечном счёте разрешается сервером, — формируется путём применения преобразований к запрошенному query, в том числе путём включения директив @validate и @resolveValueAndMerge для каждого поля.

Внутренний процесс внутри GraphQL-сервера

Например, если запрошенный query выглядит так:

{
  posts {
    url
    title @uppercase
    content @include(if: $addContent)
  }
}

Исполняемый query будет таким:

{
  posts @validate @resolveValueAndMerge {
    url @validate @resolveValueAndMerge
    title @validate @resolveValueAndMerge @uppercase
    content @validate @include(if: $addContent) @resolveValueAndMerge
  }
}

Где это используется

Gato GraphQL использует этот механизм для формирования исполняемого query в следующих случаях: