AppSync中满足条件仍触发PutItem条件异常的求助
问题分析与解决思路
你的问题核心是对DynamoDB PutItem条件表达式的作用逻辑理解有误:
当你用$util.autoId()生成全新ID执行PutItem时,目标项在DynamoDB中不存在。此时条件表达式description = :sizeValue会直接判断失败——因为不存在的项没有任何属性,自然无法满足"description等于test"的条件,因此DynamoDB返回条件请求失败。
针对不同需求的解决办法
需求1:限制创建的Todo的description必须为"test"
不需要依赖DynamoDB的条件表达式,直接在Resolver请求模板中做输入校验:
#if( $ctx.args.input.description != "test" ) $util.error("Description must be 'test'") #end { "operation": "PutItem", "key": { "id": $util.dynamodb.toDynamoDBJson($util.autoId()) }, "attributeValues" : { "name" : $util.dynamodb.toDynamoDBJson($ctx.args.input.name), "description" : $util.dynamodb.toDynamoDBJson($ctx.args.input.description) } }
这样如果输入的description不符合要求,Resolver会直接抛出错误,不会发起无效的DynamoDB请求。
需求2:仅允许更新已有且description为"test"的项
如果你的场景是覆盖更新现有项(而非创建新项),需要调整条件表达式,先确认项存在,再匹配description:
{ "operation": "PutItem", "key": { "id": $util.dynamodb.toDynamoDBJson($ctx.args.input.id) // 使用传入的现有项ID,而非autoId }, "attributeValues" : { "name" : $util.dynamodb.toDynamoDBJson($ctx.args.input.name), "description" : $util.dynamodb.toDynamoDBJson($ctx.args.input.description) }, "condition": { "expression": "attribute_exists(id) AND description = :sizeValue", "expressionValues": { ":sizeValue": { "S":"test" } } } }
额外排查建议
你提到CloudWatch日志显示条件已匹配,建议仔细核对日志中的以下内容:
- 实际发送给DynamoDB的
ConditionExpression和ExpressionValues是否和预期一致 - 请求中的
Key对应的项是否确实不存在(autoId生成的是全新ID,大概率不存在)
内容的提问来源于stack exchange,提问作者rey
相关产品推荐
相关产品推荐

