AWS Amplify GraphQL订阅报错:非空AWSDateTime字段返回null求助
问题分析与解决办法
首先看报错信息:
Cannot return null for non-nullable type: 'AWSDateTime' within parent 'Chat' (/onCreateChat/createdAt)
这里有个明显的矛盾点——你配置的是Todo的突变和订阅,但报错指向的是Chat类型。先排查这个:
- 检查Flutter代码里的订阅是不是误写成了
onCreateChat而不是onCreateTodo - 确认GraphQL schema里的订阅定义有没有和Chat模型搞混
如果排除了类型混淆的问题,核心原因是Lambda执行createTodo突变时,返回的Todo对象里createdAt字段为null,但这个字段在GraphQL Todo模型中被定义为非空类型(AWSDateTime!)。
虽然你突变和订阅的返回类型都是Todo,但GraphQL会严格校验每个字段的非空约束——只要返回的对象里非空字段为null,订阅就会触发这个错误。这也是你看到的GitHub方案的核心:突变返回的对象必须完整包含订阅期望的所有非空字段,不能有缺失或null值。
具体修复步骤:
- 检查Todo的GraphQL模型定义,找到
type Todo部分,确认createdAt字段是不是带!标记(示例:createdAt: AWSDateTime!)。如果是,这个字段绝对不能返回null。 - 修正Lambda函数的逻辑:
- 若Todo存储在DynamoDB,确保表配置了自动生成
createdAt的时间戳属性,且Lambda在返回Todo对象时,正确读取并返回该字段。 - 若Lambda自行生成时间,要生成符合
AWSDateTime格式的字符串(比如2024-05-20T14:30:00Z),并赋值给createdAt字段后再返回。
- 若Todo存储在DynamoDB,确保表配置了自动生成
- 用AppSync控制台测试
createTodo突变,查看返回的Todo对象里createdAt是否有有效值。如果这里返回的就是null,订阅必然报错。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

