Схема, используемая вашей конечной точкой GraphQL, не обязательно должна соответствовать форме данных, предоставляемых какими-либо слоями данных, используемыми вашим сервером.Поля, которые вы определяете для определенного GraphQLObjectType
, просто определяют, какие поля могут запрашиваться для этого типа клиентами.
Это означает, что каждая книга в массиве books
может иметь некоторое дополнительное свойство (например, upc
или numberOfCheckouts
) но это свойство не обязательно должно отображаться в вашей схеме.Если у вас была таблица пользователей в базе данных, включающая поле password
и тип User
, вы, возможно, не захотите выставлять password
как поле этого типа, даже если вы включите другие поля.
Аналогично, тип может иметь поле, имя которого не соответствует базовым данным.Здесь каждая книга не имеет свойства author
, а тип Book
.Предоставляя функцию resolve
для поля, вы сообщаете GraphQL, как разрешить это поле (или присвоить ему значение).
Точная логика, лежащая в основе того, как GraphQL разрешает полезначения, вероятно, выходят за рамки этого вопроса, но вы можете взглянуть на спецификацию для более подробной информации.Здесь уместно, что каждое поле должно иметь какое-то значение.Если вы не предоставляете функцию resolve
, GraphQL использует распознаватель по умолчанию , который ищет свойство в объекте parent , передаваемом сопоставителю, имя которого совпадает с именем полярешается.Если распознаватель по умолчанию находит свойство с тем же именем, он возвращает значение этого свойства;в противном случае возвращается ноль.
Именно поэтому вы можете добавлять поля к Book
, например id
, name
или genre
, без указания функции resolve
- распознаватель по умолчанию выполняет всю работу подhood.
Что касается конкретно Типов объектов, важно понимать, что значение, возвращаемое преобразователем поля, который возвращает тип объекта , становится родительским значением, передаваемым преобразователям поля поля для этого типа..
Таким образом, если поле имеет тип [Book]
, оно будет (если реализовано правильно) возвращать массив объектов.Этот массив может быть, например, фиктивными данными в вашем вопросе.Каждый объект в этом массиве будет затем передан в функцию resolve
для каждого поля типа Book
, которое было включено в запрос клиента.Поэтому, если клиент запрашивает только id
и name
для каждой книги, функция resolve
для каждого из этих двух полей будет выполняться для каждой книги в массиве, возвращаемом распознавателем родительского поля.
Функция resolve
, или преобразователь, передается в родительском значении, аргументах для разрешаемого поля и контексте всего запроса.Вся информация может быть использована для разрешения любого поля, которое вы можете произвольно определить для определенного типа.
Надеюсь, это обеспечит вам дополнительную ясность.При построении схемы ваше решение о том, какие поля определять для типа, вероятно, будет зависеть от уровня данных, но не ограничивается этим.