GraphQL: Что такое спецификация rootValue, которая передается для выполнения? - PullRequest
0 голосов
/ 22 января 2019

Я использую express-graphql, который инициализируется с помощью rootValue и передает его в функцию GraphQL execute . Интересно, что такое спецификация rootValue? Я видел несколько простых примеров, но меня интересует полная спецификация.

1 Ответ

0 голосов
/ 22 января 2019

rootValue является специфическим для реализации javascript и, насколько мне известно, не является тем, что явно требуется официальной спецификацией.

Это определение типа для функции (или резольвера) resolve, предоставленной в документах :

type GraphQLFieldResolveFn = (
  source?: any,
  args?: {[argName: string]: any},
  context?: any,
  info?: GraphQLResolveInfo
) => any

Первый параметр, передаваемый распознавателю, - это значение «source», «root» или «parent». Поле всегда связано с некоторым типом объекта. «Исходное» значение - это просто значение, в котором разрешено поле, возвращающее этот тип объекта. Например, заданный запрос типа:

{
  user(id: 1) {
    location {
      city
    }
  }
}

Поле user возвращает тип объекта. Когда он разрешается, разрешенное значение передается распознавателю location в качестве «источника». Точно так же, когда location разрешает, разрешенное значение передается распознавателям для всех его запрошенных полей, например city.

В нашем примере user - это поле, как и любое другое, оно просто относится к типу Query, но сам этот тип все еще является типом Object. Поскольку это поле, оно разрешается путем вызова связующего с ним. Но поскольку он находится в root запроса, значение «source» отсутствует. Это единственное назначение rootValue, которое вы передаете execute - оно передается каждому распознавателю корневого уровня в качестве значения "source".

Другими словами, все, что вы установили rootValue, будет передаваться в качестве первого параметра для распознавателя для каждого поля типов Query, Mutation и Subscription.

Поскольку rootValue доступен только для распознавателей корневого уровня, он очень ограничен в использовании. Любые данные, которые должны быть доступны для всех распознавателей, должны быть включены в контекст.

Для завершения отметим, что есть примеры, показывающие, как создать схему с использованием SDL и buildSchema. Поскольку buildSchema не предлагает способ предоставления преобразователей для каких-либо полей, в этих примерах представлен способ разрешения полей корневого уровня путем передачи функций распознавателя через rootValue. Это работает, потому что, как отмечают документы:

[Если] функция распознавателя не предоставлена, тогда используется распознаватель по умолчанию, который ищет метод в источнике с тем же именем, что и у поля. Если найден, метод вызывается с помощью (args, context, info).

Однако, опять же, rootValue доступен только для полей корневых типов (Query, Mutation и Subscription). Если вы создадите схему таким способом, вы не сможете определить преобразователи для полей любых других типов. Другими словами, не делай этого. См. этот ответ для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...