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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:17:04