AppSync GraphQL Mutation未更新DynamoDB对象问题求助
AppSync Mutation执行无报错但未更新对象的问题排查与解决
可能的原因及对应解决方法
1. GraphQL输入格式错误(最常见)
你的mutation中status: ERROR如果对应的是String类型字段,必须给值加上双引号,写成status: "ERROR"。不带引号的ERROR会被GraphQL解析为一个未定义的变量,导致该字段实际未传入,自然不会触发更新。
修正后的mutation示例:
mutation { updatePayment(input: {id: "7101d985-43e4-4fe9-8b29-51f8accc39e1", status: "ERROR", amount: 92123}) { id account_number amount date status } }
(注:如果status是枚举类型,无需加引号,但需确认schema中枚举值确实包含ERROR)
2. AppSync Resolver逻辑问题
VTL resolver场景:
- 检查请求映射模板是否正确构造了
UpdateItem操作:- 确保包含正确的
UpdateExpression,明确指定要更新的字段(如SET #status = :status, #amount = :amount) - 确认
returnValues设置为ALL_NEW,这样才会返回更新后的对象,而非原对象 - 排查是否存在不必要的
ConditionExpression,如果条件不满足DynamoDB会静默失败(需在模板中添加异常处理抛出错误)
- 确保包含正确的
Lambda resolver场景:
- 检查Lambda函数是否正确调用了DynamoDB的
updateItemAPI,且设置了ReturnValues: 'ALL_NEW' - 确认函数返回的是更新后的记录属性,而非查询原记录的结果
3. 字段类型不匹配
确认输入的amount类型与schema定义一致:
- 如果schema中
amount是Float或Decimal类型,传入整数92123是合法的,但如果是其他类型(如String)则需转换格式 - 若类型不匹配,部分场景下resolver会忽略该字段更新,而非抛出错误
4. DynamoDB记录条件检查失败
如果resolver中配置了ConditionExpression(比如限制仅当记录处于某个状态时可更新),需确认当前记录的状态满足该条件。例如若Condition要求status = 'PENDING',但当前记录是SCHEDULED,则更新会静默失败。
内容的提问来源于stack exchange,提问作者Azeem Subhani
相关产品推荐
相关产品推荐

