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). Если вы создадите схему таким способом, вы не сможете определить преобразователи для полей любых других типов. Другими словами, не делай этого. См. этот ответ для более подробной информации.