DynamoDB UpdateItem指定ALL_NEW后AppSync返回User.id为null报错
问题根源
非空报错本质是Lambda返回值的字段映射完全不匹配DynamoDB的返回结构,具体有两个核心错误:
- DynamoDB的
update接口调用成功后,返回的对象不会直接挂载属性,所有更新后的属性都放在Attributes字段下。你代码里直接写Item.pk相当于访问整个返回对象的pk字段,这个字段不存在,自然返回null,触发ID非空校验。 - 你DynamoDB里的用户属性(name、avatarUrl、createdAt等)都存储在
details嵌套对象下,你代码里直接取Item.displayName等字段也完全取不到,都是undefined。
修复方案
直接修改Lambda的返回值构造逻辑,调整字段取值路径即可:
const Item = await dynamoDB.update(params).promise(); console.log(Item); // 先取Attributes字段,再按存储层级取对应属性 const attrs = Item.Attributes; return { id: attrs.pk, name: attrs.details.displayName, avatarUrl: attrs.details.avatarUrl, createdAt: attrs.details.createdAt, updatedAt: attrs.details.updatedAt };
通用排查思路
遇到AppSync GraphQL非空返回报错可以按优先级排查:
- 先检查Resolver/Lambda的返回结构是否和GraphQL schema定义的字段完全匹配,大小写、嵌套层级都要对应
- 打印数据源(这里是DynamoDB)的原始返回,确认字段实际存储位置
- 检查schema中定义的非空字段是否真的在返回值里有赋值,没有值的话要么补默认值要么把schema的非空标记去掉
内容的提问来源于stack exchange,提问作者Sumchans
相关产品推荐
相关产品推荐

