Как обрабатывать список внутри соединения в Graphql Relay - PullRequest
0 голосов
/ 09 июля 2019

У меня есть такая схема:

type SectionItem = {
  a: String
}

type SectionRowConnection {
  pageInfo: PageInfo!
  edges: [SectionRowEdge]
}

type SectionRowEdge {
  node: [SectionItem]
  cursor: String!
}

Я хочу получить список в каждом узле подключения, и когда я запускаю запрос ниже, все работает нормально:

query {
  sectionRows(type:someType){
    edges{
      node{
        a
      }
    }
  }
}

Сейчас я использую Relay в клиенте, но получаю эту ошибку, пытаясь построить запрос с использованием relay:

ОШИБКА: Обнаружена 1 ошибка (и): - @connection используется в неверном поле sectionRows. Ожидается, что тип поля SectionRowConnection будет иметь поле edges { node }, которое возвращает объект, интерфейс или объединение.

Как показывает ошибка, я не могу использовать List внутри соединения реле, но я хочу иметь схему, подобную этой, любые идеи о том, как использовать реле с этой схемой или рекомендовать обходной путь для этой проблемы?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

То, что я закончил, заключалось в том, чтобы обернуть список результатов внутри объекта, то есть каждый узел имеет тип SectionRow, который представляет собой graphQlObjectType с полем items, список находится внутри списка элементов.вот результирующая схема:

type SectionItem = {
  a: String
}

type SectionRow = {
  items: [SectionItem]
}

type SectionRowConnection {
  pageInfo: PageInfo!
  edges: [SectionRowEdge]
}

type SectionRowEdge {
  node: SectionRow
  cursor: String!
}
0 голосов
/ 09 июля 2019

Из реле spec :

«Edge Type» должен содержать поле с именем node.Это поле должно возвращать либо Scalar, Enum, Object, Interface, Union, либо ненулевую оболочку вокруг одного из этих типов.В частности, это поле не может возвращать список.

Другими словами, SectionRowConnection не соответствует требованиям Relay для типа соединения, поскольку его поле узла является списком.Для этого нет обходного пути, кроме изменения схемы таким образом, чтобы тип node был SectionItem! вместо [SectionItem].Если вы хотите использовать Relay, ваша схема должна соответствовать спецификации Relay.

Само соединение представляет собой набор отдельных узлов (или «ресурсов», если мы заимствуем терминологию REST), причем каждое ребро соединяет кореньузел к отдельному узлу в коллекции.

Например, мы можем представить один узел пользователя с полем friends, которое возвращает UserConnection.Каждое ребро в соединении будет представлять связь между исходным узлом пользователя и одним из друзей-друзей.Каждое ребро будет иметь один пользовательский узел.

Эта коллекция пользовательских узлов может быть естественным образом отсортирована и отфильтрована по мере необходимости.Однако если бы мы хотели сгруппировать их вместе по некоторым критериям (аналогично GROUP BY в SQL), мы бы создали отдельный тип UserGroup и UserGroupConnection.Каждый узел UserGroup внутри UserGroupConnection сам по себе будет иметь некоторое поле, которое является UserConnection.Даже в этом сценарии у каждого края соединения все еще есть только один узел .

Из вашей схемы неясно, пытались ли вы просто выполнить простую фильтрацию или «группировать» свои узлы, как показано выше,В любом случае, концептуально, нет никаких причин, чтобы когда-либо ребро возвращало List для своего поля node.

...