AWS AppSync GraphQL订阅事件空数据报错问题咨询
问题原因
AWS AppSync在2022年确实调整了GraphQL订阅的触发数据处理逻辑,你遇到的问题就是这次不向后兼容的服务端变更导致的,和你两年未使用期间的服务端更新直接相关:
- 旧版本逻辑:关联订阅的变更操作返回数组类型时,服务端会自动遍历数组中的每个元素,把单个元素作为推送载荷发给返回值为单对象类型的订阅,也就是隐式做数组展开。
- 新版本逻辑:订阅触发时严格校验变更返回值和订阅定义的返回类型,不再做自动数组展开,直接把变更的完整返回结果按照订阅定义的返回类型做字段解析。
你当前的最小复现配置刚好完全命中这个逻辑变更的影响范围:
- 你定义的
pushItems变更返回类型是[Item](Item数组),但关联的onItemChange订阅返回类型是单个Item对象 - 你用None数据源时,请求模板直接把入参里的
items数组作为payload返回,控制台执行变更能拿到正确结果,是因为GraphQL处理数组返回值时,会自动遍历每个元素提取查询的id属性;但推送给订阅时,服务端直接把整个数组当成单个Item对象解析,数组顶层不存在id字段,就抛出了非空字段id为null的错误。
修复方案
根据实际业务需求二选一即可:
- 适配批量推送场景:把订阅的返回类型修改为和变更完全一致的数组类型
调整后不需要改动解析器配置,订阅端会一次性收到整批推送的条目数组。type Subscription { onItemChange: [Item] @aws_subscribe(mutations: ["pushItems"]) } - 适配单条推送场景:如果业务要求每次变更触发单条订阅推送,要么把
pushItems的返回类型改为单个Item,要么在解析器的响应映射模板中手动返回单个对象。比如每次变更只传单个条目时,可以把响应映射模板改成:
注意这种配置下如果一次传入多个item,只会推送数组第一个元素到订阅端。如果需要数组里每个元素都单独触发一次订阅,需要调整业务逻辑,把批量传参拆成多次变更调用,每次传入单个条目。$util.toJson($context.result[0])
内容的提问来源于stack exchange,提问作者Jonathan Holvey。
相关产品推荐
相关产品推荐

