GraphQL多层嵌套对象属性读取报错:非空字段返回null
解决GraphQL多层嵌套查询返回Null的报错问题
嘿,我来帮你捋清楚这个问题——你收到的"Cannot return null for non-nullable field"报错,核心原因是你的GraphQL类型定义和查询语句不匹配,具体细节如下:
问题到底出在哪?
先看你定义的Mapping类型:
type Mapping { id: ID! partnerSegmentId: ID! ctSegmentId: CtSegment! }
这里的partnerSegmentId是标量类型ID!,简单说就是它只能返回一个ID字符串/数字,根本没有子字段。但你的查询里却把它当成了PartnerSegment对象来做嵌套查询:
{ allMappings { partnerSegmentId { id name partner { id } } } }
这就导致GraphQL没法解析你的请求——标量类型没有子字段,只能返回null,但你又把partnerSegmentId定义成了非空(带!),所以直接触发了报错。
怎么修正?
最直接的方案是调整Mapping的类型定义,把partnerSegmentId替换成关联的PartnerSegment对象类型(同时建议改个更语义化的字段名):
type Mapping { id: ID! partnerSegment: PartnerSegment! # 改成对象类型,字段名更清晰 ctSegmentId: CtSegment! }
然后把查询语句改成对应字段:
{ allMappings { partnerSegment { id name partner { id } } } }
如果因为业务需求必须保留partnerSegmentId这个标量ID字段,同时还要查询关联的对象,那可以在Mapping里同时加两个字段:
type Mapping { id: ID! partnerSegmentId: ID! partnerSegment: PartnerSegment! # 新增关联对象字段 ctSegmentId: CtSegment! }
这样查询时就能按需选择:
{ allMappings { partnerSegmentId # 单独查ID partnerSegment { # 查嵌套的对象字段 id name partner { id } } } }
最后要注意的小细节
别忘了同步调整你的GraphQL resolver!要确保partnerSegment字段的resolver能根据partnerSegmentId从数据源(比如数据库)正确获取对应的PartnerSegment对象并返回,要是resolver返回null,还是会触发非空字段的报错哦。
内容的提问来源于stack exchange,提问作者Dan Zawadzki
相关产品推荐
相关产品推荐

