我有一个这样的架构:
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 }
字段,该对象返回对象,接口或联合。
正如错误所暗示的,我不能在中继连接中使用列表,但是我想要一个这样的架构,关于如何在该架构中使用中继的任何构想或为该问题推荐解决方法?
答案 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!
}