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 example和the 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
。
答案 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(较低级别)属性类型时,必须指定。