英文:
DynamoDB error: The provided key element does not match the schema
问题
我知道关于这个错误有很多类似的问题,但我已经尽力搜索它们,却找不到答案。
我在DynamoDB中创建了一张表,其中有一个分区键名为"token",没有排序键。
然后我想在Lambda函数中更新项目(如果不存在则插入新项目)。我的源代码如下:
docClient = new AWS.DynamoDB.DocumentClient({region: region});
let params = {
TableName: table_name,
Key: {
token: token
},
UpdateExpression: "Set xxx = :xxx, yyy = :yyy",
ExpressionAttributeValues: {
':xxx': xxx,
':yyy': yyy
}
};
await docClient.update(params).promise();
我已经检查了表名和键是正确的,但我一直收到错误消息:提供的键元素与模式不匹配。
这段代码在开发环境中运行良好,所以我不明白为什么在生产环境中失败了。
由于添加排序键很困难,所以我没有更改表本身。
我尝试创建一个具有相同属性的虚拟记录,但没有成功。
我在docClient.update()
之前输出了参数,结果如下:
{
"TableName": "the_table_name",
"Key": {
"token": "this_is_1_token-with-alphabet-number-hyphen_underline"
},
"UpdateExpression": "Set xxx = :xxx, yyy = :yyy",
"ExpressionAttributeValues": {
":xxx": "some_string",
":yyy": "another_string"
}
}
英文:
I know there are so many similar questions about the error, but I tried my best to search them only to find no answer to my question.
I have created a table in dynamoDB, with a partition key named "token", no sort key.
Then I want to update item (insert a new one if not exists) in lambda function. My source code is like this:
docClient = new AWS.DynamoDB.DocumentClient({region: region});
let params = {
TableName: table_name,
Key: {
token: token
},
UpdateExpression: "Set xxx = :xxx, yyy = :yyy",
ExpressionAttributeValues: {
':xxx': xxx,
':yyy': yyy
}
};
await docClient.update(params).promise();
I have checked that the table name and the key is correct, but I keep getting the error: The provided key element does not match the schema.
This code works good in develop env, so I get confused why it failed in production env.
It is difficult to add a sort key, so I did not change the table itself.
I tried creating a dummy record with the same attributes, it did not work.
I output the params before docClient.update()
, it was like this:
{
"TableName": "the_table_name",
"Key": {
"token": "this_is_1_token-with-alphabet-number-hyphen_underline"
},
"UpdateExpression": "Set xxx = :xxx, yyy = :yyy",
"ExpressionAttributeValues": {
":xxx": "some_string",
":yyy": "another_string"
}
}
答案1
得分: 2
我写这封信是基于我对你的问题的期待,我假设你正在使用AWS.DynamoDB.DocumentClient
,它期望你的值采用本机JSON格式。所以我假设你正在传递低级别的DynamoDB-JSON格式,如下所示:
Key: {
token: {"S":"some-token"}
},
然而,你应该使用以下格式:
Key: {
token: "some-token"
},
如果我的假设不正确,下一步检查我会做的是数据类型,请确保你为token
传递了正确的数据类型,因为DocumentClient会直接从JavaScript中推断数据类型。
接下来,我会进行DescribeTable
API调用,并查看输出中的键,确保键名周围没有多余的前导/尾随空格,例如: token
或token
。
英文:
I'm writing this as an assumption awaiting your response to my question. As you are using the AWS.DynamoDB.DocumentClient
it expects your values to be in native JSON format. So I assume you are passing in the low level DynamoDB-JSON format like below:
Key: {
token: {"S":"some-token"}
},
Whereas you should be using the following:
Key: {
token: "some-token"
},
If my assumption is incorrect, the next check I would do is the data type, be sure you are passing in the correct data type for token
as the DocumentClient infers the data type directly from javascript.
Next, I would do a DescribeTable
API call and look at the Keys in the output, be sure there is no trailing/leading white space around the key name, for example: token
or token
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论