Запрос с Relay и GraphQL

Я следил за учебником для React + Relay + GraphQL @https://facebook.github.io/relay/docs/tutorial.html

И я был смущен тем, какой интерфейс: [nodeInterface] делает в определении объекта GraphQL.

2 ответа

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

nodeInterface ТОЛЬКО используется GraphQL, когда клиентская сторона (обычно браузер) запрашивает фрагмент данных GraphQL, который уже находится в его распоряжении из начальной выборки, для повторной выборки.

Повторная выборка выполняется при любом из этих обстоятельств:

  • Другая/одна и та же реакционная компонента (на той же веб-странице) запрашивает дополнительные фрагменты данных на более позднем этапе и эти данные недоступны в исходных данных
  • Код в компоненте React выполняет this.props.relay.forceFetch(), что обычно происходит, если программист считает, что данные на стороне сервера могут быть изменены из-за других внешних
  • Код в компоненте React выполняет this.props.relay.setVariable(...), когда пользователь выполняет действие, такое как изменение количества отображаемых элементов, размер изображения и т.д., для которого требуется изменение исходных данных.

Во время повторной выборки GraphQL вызывает nodeInterface с глобальным идентификатором Node, который nodeInterface должен получить объект на стороне сервера, связанный с этим идентификатором Node. С помощью этого серверного объекта сервер GraphQL может затем возвращать дополнительные/вариации данных, требуемых клиентом.

Таким образом, идентификатор Node никогда не требуется, если исходные данные объекта никогда не исправляются.

Подробнее см. в https://medium.com/@khor/relay-graphql-de-mystifying-node-id-38757121b9c

Подробнее

nodeInterface выполняет Node ID для разрешения на стороне сервера, поэтому он всегда выглядит примерно так:

var {nodeInterface, nodeField} = nodeDefinitions(
 (globalId) => {
 var {type, id} = fromGlobalId(globalId);
 if (type === 'ClassA') {
 // Get ClassA type of instance with id
 // E.g.,
 return ClassA.find_by_id(id)
 } else if (type === 'ClassB') {
 return ClassB.find_by_id(id)
 }
 ...
 }
)

Так как для типов GraphQL, которые необходимо переназначить, требуется Node ID, в схеме GraphQL вам необходимо:

  • Запросить, чтобы GraphQL автоматически генерировал идентификатор Node при создании экземпляра типа GraphQL, используя globalIdField keyword
  • Скажите GraphQL, как этот тип GraphQL разрешает идентификатор Node, предоставленный во время повторной выборки на соответствующий серверный объект, который является вашим interface : [nodeInterface]

Таким образом:

var ClassAType = new GraphQLObjectType({
 name: 'ClassA',
 description: 'A',
  fields: () => ({
  id: globalIdField('ClassA'),
 ... other fields ...
 }),
 interfaces: [nodeInterface],
});


Для сервера GraphQL, совместимого с реле, объект с глобальным идентификатором называется Node, любой Node может быть refetch по запросу

{
 node: (id: "some global id") {
 id,
 ... on SomeType {
 someField
 }
 }
}
Интерфейс

Node используется для этого в схеме GraphGL, которая помогает вам определить тип с глобальным идентификатором.

Проверьте информацию Глобальная идентификация объекта и Спецификация

licensed under cc by-sa 3.0 with attribution.