如何在 Graphql Relay 中处理连接内的列表

Posted

技术标签:

【中文标题】如何在 Graphql Relay 中处理连接内的列表【英文标题】:How to Handle List inside Connection in Graphql Relay 【发布时间】:2019-11-18 22:59:21 【问题描述】:

我有这样的架构:

type SectionItem = 
  a: String


type SectionRowConnection 
  pageInfo: PageInfo!
  edges: [SectionRowEdge]


type SectionRowEdge 
  node: [SectionItem]
  cursor: String!

我想在每个连接节点中获取一个列表,当我手动运行以下查询时,一切正常:

query 
  sectionRows(type:someType)
    edges
      node
        a
      
    
  

现在我在客户端使用中继,但尝试使用中继构建查询时出现此错误:

错误: 遇到 1 个错误: - @connection 用于无效字段 sectionRows。期望字段类型 SectionRowConnection 具有返回对象、接口或联合的 edges node 字段。

正如错误所暗示的,我不能在中继连接中使用 List,但我想要这样的架构,关于如何使用中继与此架构的任何想法或推荐解决此问题的方法?

【问题讨论】:

【参考方案1】:

我最终做的是将结果列表包装在一个对象中,即每个节点都是 SectionRow 类型,这是一个 graphQlObjectType 有一个 items 字段,列表在项目列表中。这是生成的架构:

type SectionItem = 
  a: String


type SectionRow = 
  items: [SectionItem]


type SectionRowConnection 
  pageInfo: PageInfo!
  edges: [SectionRowEdge]


type SectionRowEdge 
  node: SectionRow
  cursor: String!

【讨论】:

【参考方案2】:

来自中继spec:

“边缘类型”必须包含一个名为节点的字段。此字段必须返回标量、枚举、对象、接口、联合或围绕这些类型之一的非空包装器。值得注意的是,这个字段不能返回一个列表。

换句话说,SectionRowConnection 不满足 Relay 对连接类型的要求,因为它的节点字段是一个 List。除了修改架构以使node 的类型为SectionItem! 而不是[SectionItem] 之外,没有其他解决方法。如果您想使用 Relay,您的架构必须符合 Relay 规范。

连接本身表示单个节点的集合(或“资源”,如果我们借用 REST 术语),每条边都将根节点连接到集合中的单个节点。

例如,我们可以想象一个具有friends 字段的单个用户节点,该字段返回一个用户连接。连接中的每条边将代表原始用户节点和其中一个朋友用户之间的关联。每条边都有一个用户节点。

这个用户节点集合自然可以根据需要进行排序和过滤。但是,如果我们想根据某些标准将它们分组在一起(类似于 SQL 中的GROUP BY),我们将创建一个单独的 UserGroup 类型和一个 UserGroupConnection。 UserGroupConnection 中的每个 UserGroup 节点本身都会有一些字段,即 UserConnection。即使在这种情况下,每个连接的边缘仍然只有一个节点

如果您只是尝试进行简单的过滤或“分组”您的节点,如上所示,仅从您的架构中就不清楚了。无论哪种方式,从概念上讲,没有理由让边缘为其node 字段返回一个列表。

【讨论】:

嗯,这个场景是这样的:应用程序看起来像一个商店,主页可能包含很多行(这里的连接),每一行都有一个项目列表,类似于 appstore 的应用程序部分,所以在这种情况下,最简单的想法是有一个列表的连接,但中继不允许它。

以上是关于如何在 Graphql Relay 中处理连接内的列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GraphQL (Relay) 中查询和改变数组类型?

GraphQL + Relay:如何执行重新获取授权?

GraphQL、Relay 和 Mongodb (mongoose) 如何获取数组

在 GraphQL/Relay 中处理隐私

在 graphql/relay 中维护有序列表

Relay/GraphQL 将自定义字段添加到连接