You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,要么在解析器的响应映射模板中手动返回单个对象。比如每次变更只传单个条目时,可以把响应映射模板改成:
    $util.toJson($context.result[0])
    
    注意这种配置下如果一次传入多个item,只会推送数组第一个元素到订阅端。如果需要数组里每个元素都单独触发一次订阅,需要调整业务逻辑,把批量传参拆成多次变更调用,每次传入单个条目。

内容的提问来源于stack exchange,提问作者Jonathan Holvey。

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:06:23