带有JavaScript的AWS DynamoDB事务:一个或多个参数值无效

时间:2019-08-16 19:31:04

标签: javascript amazon-web-services transactions amazon-dynamodb

Obi-Wan,请帮助我...

我正在尝试做一个docClient.transactWrite(params),而我的params看起来像(还有其他字段,试图将其保持简短):

{
  "TransactItems": [
    {
      "Put": {
        "Item": {
          "slug": {
            "S": "marbled_crockpot_cheesecake"
          },
          "tag": {
            "S": "metadata"
          },
          "recipe_name": {
            "S": "Marbled Crockpot Cheesecake"
          }
        },
        "TableName": "recipes-table-dev"
      }
    },
    {
      "Put": {
        "Item": {
          "slug": {
            "S": "marbled_crockpot_cheesecake"
          },
          "tag": {
            "S": "marbled"
          },
          "recipe_name": {
            "S": "Marbled Crockpot Cheesecake"
          }
        },
        "TableName": "recipes-table-dev"
      }
    }
  ]
}

据我所知,this examplethe official documentation很好,但是每当我运行它时,都会出现以下错误:

ERROR   Error performing transactWrite { cancellationReasons:
[ { Code: 'ValidationError',
Message:
'One or more parameter values were invalid: Type mismatch for key slug
 expected: S actual: M' } ],

我应该指出,主分区键是slug (String),而主排序键是tag (String)。所以我听不懂Type mismatch for key slug expected: S actual: M这个词:如果期望S,那是我发送的,对吗?我在任何地方都看不到M

1 个答案:

答案 0 :(得分:1)

使用Document Client(提供比DynamoDB class更高级别的API)时,请注意以下几点:

  

文档客户端通过抽象化属性值的概念,简化了在Amazon DynamoDB中处理项目的工作。 此抽象方法对作为输入参数提供的本机JavaScript类型进行注释,并将注释后的响应数据转换为本机JavaScript类型。

     

文档客户端为开发人员提供了使用本机JavaScript类型而不是AttributeValue的功能,以简化Amazon DynamoDB的JavaScript开发体验。作为参数传递的JavaScript对象将编组为Amazon DynamoDB所需的AttributeValue形状。 DocumentClient将来自DynamoDB的响应解组到普通的JavaScript对象中。 DocumentClient不接受AttributeValue来支持本机JavaScript类型

这意味着slug必须是具有属性类型的纯字符串(S),而不是映射(M)。

以下方法应该起作用:

{
  "TransactItems": [
    {
      "Put": {
        "Item": {
          "slug": "marbled_crockpot_cheesecake",
          "tag": "metadata",
          "recipe_name": "Marbled Crockpot Cheesecake",
        },
        "TableName": "recipes-table-dev"
      }
    },
    {
      "Put": {
        "Item": {
          "slug": "marbled_crockpot_cheesecake",
          "tag": "marbled",
          "recipe_name": "Marbled Crockpot Cheesecake"
        },
        "TableName": "recipes-table-dev"
      }
    }
  ]
}

在直接使用DynamoDB class(较低级别)属性类型时,必须指定。