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

时间:2019-07-09 11:35:29

标签: graphql graphql-js relayjs

我有一个这样的架构:

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 }字段,该对象返回对象,接口或联合。

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

2 个答案:

答案 0 :(得分:0)

从中继spec

  

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

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

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

例如,我们可以想象一个具有friends字段并返回UserConnection的User节点。连接中的每个边缘将代表原始用户节点和一个好友用户之间的关联。每个边缘将有一个用户节点。

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

仅从模式尚不清楚,是否尝试进行简单的过滤或“分组”节点,如上所示。无论哪种方式,从概念上讲,没有理由让边缘返回其node字段的列表。

答案 1 :(得分:0)

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

type SectionItem = {
  a: String
}

type SectionRow = {
  items: [SectionItem]
}

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

type SectionRowEdge {
  node: SectionRow
  cursor: String!
}