React Native+AWS AppSync中GraphQL非空字段Person返回null报错求助
嘿,作为GraphQL新手遇到这个问题很正常,咱们来一步步搞清楚它到底是怎么回事,以及怎么解决~
首先,先解读一下这个错误信息:
"Cannot return null for non-nullable type: 'Person' within parent 'Messages' (/getMessages/sendBy)"
这句话的核心意思是:你的Messages类型里,sendBy被定义为非空的Person类型(Person!),但查询这条Message的时候,AppSync找不到对应的Person数据,只能返回null,这就违反了Schema的非空约束,所以抛出了错误。
接下来,我们从几个常见的方向排查和解决:
1. 检查关联的Person数据是否存在
这是最常见的原因:你查询的这条Message,它关联的Person记录可能已经被删除,或者从一开始就没正确关联上。
- 打开你的DynamoDB控制台(假设用的是DynamoDB作为数据源),找到存储Messages的表,查询id为
a0546b5d-1faf-444c-b243-fab5e1f47d2d的那条记录。 - 查看这条记录里的关联字段(通常是
sendById或者类似的字段,由AppSync的@relation自动生成),拿到这个字段的值。 - 再去Person表中查询是否存在id等于这个值的记录。如果不存在,那问题就出在这——要么是创建Message时关联了错误的Person id,要么是对应的Person被删除了。
2. 验证@relation关联配置是否正确
你的Schema里用了@relation(name: "UserMessages")来建立Person和Messages的关联,要确保这个配置是双向正确的:
- 确认
Person类型里的messages字段和Messages类型里的sendBy字段用的是同一个@relation名称(你这里都是UserMessages,这部分是对的)。 - 如果是手动配置的Resolver,要检查
sendBy字段的Resolver是否正确实现了关联查询。比如在Resolver的请求模板中,是否根据Message的关联字段去Person表中获取对应的记录,有没有写错表名或者字段名。
3. 测试单独查询Person记录
可以先单独写一个查询,验证对应的Person是否能正常获取:
query getPerson { getPerson(id: "这里填Message里的sendById值") { name } }
如果这个查询返回null或者报错,那说明Person记录确实有问题,需要先修复Person的数据,或者重新关联正确的Person id到Message上。
4. 检查Message创建时的关联逻辑
如果这条Message是刚创建的,要检查创建时的Mutation是否正确关联了sendBy:
- 比如创建Message的Mutation应该类似这样:
mutation createMessage { createMessage(input: { text: "测试消息", sendBy: { id: "正确的Person id" } }) { id text sendBy { name } } }
如果创建时没有正确传入sendBy的id,或者传入了错误的id,就会导致后续查询时找不到对应的Person。
总结一下,这个错误的本质就是Schema要求sendBy必须是存在的Person,但实际数据中没有对应的Person记录,只要找到并修复这个数据关联的问题,就能解决报错啦~
内容的提问来源于stack exchange,提问作者user9526901

