Запрос с 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.