Node.js 在节点aws sdk库中将getItem与DynamoDB一起使用时出错

Node.js 在节点aws sdk库中将getItem与DynamoDB一起使用时出错,node.js,amazon-web-services,amazon-dynamodb,Node.js,Amazon Web Services,Amazon Dynamodb,以下代码在尝试访问我的AWS DynamoDB表时生成此错误消息。表名为customers,列名为email,值为'james@gmail.com'. 我直接从这里提供的AWS示例中复制了这段代码。我做错什么了吗?我在这上面浪费了好几天,尝试了不同的事情:- 谢谢你的帮助。 谢谢 错误消息 {"message":"There were 20 validation errors:\n* InvalidParameterType: Expected params.Key['email'] to b

以下代码在尝试访问我的AWS DynamoDB表时生成此错误消息。表名为customers,列名为email,值为'james@gmail.com'. 我直接从这里提供的AWS示例中复制了这段代码。我做错什么了吗?我在这上面浪费了好几天,尝试了不同的事情:-

谢谢你的帮助。 谢谢

错误消息

{"message":"There were 20 validation errors:\n* InvalidParameterType: Expected params.Key['email'] to be a structure\n* UnexpectedParameter: Unexpected key '0' found in params.Key['email']\n* UnexpectedParameter: Unexpected key '1' found in params.Key['email']\n* UnexpectedParameter: Unexpected key '2' found in params.Key['email']\n* UnexpectedParameter: Unexpected key '3' found in params.Key['email']\n* UnexpectedParameter: Unexpected key '4' found in params.Key['email']\n* UnexpectedParameter: Unexpected key '5' found in params.Key['email']\n* UnexpectedParameter: Unexpected key '6' found in 
NodeJs代码

DynamoDB工作台

又一次尝试 我也收到了这个错误消息

{"message":"There were 20 validation errors:\n* InvalidParameterType: Expected params.Key['email'] to be a structure\n* UnexpectedParameter: Unexpected key '0' found in params.Key['email']\n* UnexpectedParameter: Unexpected key '1' found in params.Key['email']\n* UnexpectedParameter: Unexpected key '2' found in params.Key['email']\n* UnexpectedParameter: Unexpected key '3' found in params.Key['email']\n* UnexpectedParameter: Unexpected key '4' found in params.Key['email']\n* UnexpectedParameter: Unexpected key '5' found in params.Key['email']\n* UnexpectedParameter: Unexpected key '6' found in 
更新

更新

误差结果


第二次编辑:我完全没有注意到您没有使用Vladyslav Ulenko指出的DocumentClient,所以为了完整性,更新了下面的答案

您有两个选择:

第一个选项使用DynamoDB服务对象和getItem方法,如下所示:

...
var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

var params = {
  TableName: 'customers',
  Key: {
    'email': {S: 'james@gmail.com'} . // <-- pay attention to data type 'S'  
  },
};

ddb.getItem(params, function(err, data) {
    if (err) {
        res.send(err);
    } else {
        res.send(data);
    }
});
...

var docClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});


var params = {
 TableName: 'customers',
 Key: {'email': 'james@gmail.com'}
};

docClient.get(params, function (err, data) {
    if (err) {
        res.send(err);
    } else {
        res.send(data);
    }
});
...
我建议您使用DocumentClient而不是DynamoDB'getItem'操作,因为它完全处理所有数据转换

如果您没有,您还需要注意响应数据类型,例如:

data.Items.forEach(function(element, index, array) {
      console.log(element.FristName.S + " " + element.LastName.S);
    });
不确定你是否想那样做

第三次编辑: 现在您已经完成了上述操作,您将得到错误:

提供的键元素与架构不匹配

这意味着您使用的键与架构上定义的键不同,同样来自:

对于主键,必须提供所有属性。例如,对于一个简单的主键,您只需要为分区键提供一个值。对于复合主键,必须同时提供分区键和排序键的值

检查表详细信息示例上的键

并确保将此处提到的所有键都放在键参数中


同样,正如Vladyslav在其答案的评论部分所指出的,如果需要使用不是主键的属性查找项,则需要使用operation而不是getItem。您可以在第二次编辑中找到示例:我完全没有注意到您没有使用Vladyslav Ulenko指出的DocumentClient,所以为了完整性,更新了下面的答案

您有两个选择:

第一个选项使用DynamoDB服务对象和getItem方法,如下所示:

...
var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

var params = {
  TableName: 'customers',
  Key: {
    'email': {S: 'james@gmail.com'} . // <-- pay attention to data type 'S'  
  },
};

ddb.getItem(params, function(err, data) {
    if (err) {
        res.send(err);
    } else {
        res.send(data);
    }
});
...

var docClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});


var params = {
 TableName: 'customers',
 Key: {'email': 'james@gmail.com'}
};

docClient.get(params, function (err, data) {
    if (err) {
        res.send(err);
    } else {
        res.send(data);
    }
});
...
我建议您使用DocumentClient而不是DynamoDB'getItem'操作,因为它完全处理所有数据转换

如果您没有,您还需要注意响应数据类型,例如:

data.Items.forEach(function(element, index, array) {
      console.log(element.FristName.S + " " + element.LastName.S);
    });
不确定你是否想那样做

第三次编辑: 现在您已经完成了上述操作,您将得到错误:

提供的键元素与架构不匹配

这意味着您使用的键与架构上定义的键不同,同样来自:

对于主键,必须提供所有属性。例如,对于一个简单的主键,您只需要为分区键提供一个值。对于复合主键,必须同时提供分区键和排序键的值

检查表详细信息示例上的键

并确保将此处提到的所有键都放在键参数中

同样,正如Vladyslav在其答案的评论部分所指出的,如果需要使用不是主键的属性查找项,则需要使用operation而不是getItem。您可以在

中找到示例,您正在使用类似DynamoDB的DocumentClient。如果您切换行var ddb=new AWS.DynamoDB{apivation:'2012-08-10'};to var docClient=new AWS.DynamoDB.DocumentClient;,您的查询将起作用

对于普通的DynamoDB类实例,您还应该手动指定键的数据类型,您可以找到对数据类型的引用。然而,对于DocumentClient类实例,这个类负责JS类型和DynamoDB类型之间的数据映射。您可以在概述部分找到此信息。

您正在使用类似于DynamoDB的DocumentClient。如果您切换行var ddb=new AWS.DynamoDB{apivation:'2012-08-10'};to var docClient=new AWS.DynamoDB.DocumentClient;,您的查询将起作用


对于普通的DynamoDB类实例,您还应该手动指定键的数据类型,您可以找到对数据类型的引用。然而,对于DocumentClient类实例,这个类负责JS类型和DynamoDB类型之间的数据映射。您可以在概述部分找到此信息。

进行了此更改,请参阅相关更新,但仍遇到错误?James-您仍然缺少数据类型-因为您使用的是DynamoDB服务,而不是DocumentClient。更新了completenessI的答案我现在正在尝试,我已经用我在AWS.DynamoDB中尝试的选项1更新了问题,但是我得到了错误,提供的关键元素与schema@James-这是一个新问题:不断更新你的问题会让人们很困惑,顺便说一句。。。更新Answer这意味着为了在数据库中查找“通过”电子邮件,您需要使用sca

n操作,get只能与主键一起使用-在您的情况下,ID进行了此更改,请参阅相关更新,但仍然遇到错误?James-您仍然缺少数据类型-因为您使用的是DynamoDB服务,而不是DocumentClient。更新了completenessI的答案我现在正在尝试,我已经用我在AWS.DynamoDB中尝试的选项1更新了问题,但是我得到了错误,提供的关键元素与schema@James-这是一个新问题:不断更新你的问题会让人们很困惑,顺便说一句。。。更新应答这意味着在您的数据库中,为了查找“通过”电子邮件,您需要使用扫描操作,get只能与主键一起使用-在您的情况下,您是对的,我完全没有意识到他使用的不是DocumentClient,而是DynamoDB服务。我已经更新了我的答案以确保完整性,因为我看到他仍然缺少一些东西…我已经做了更改,请参阅我问题中的最新更新,但我得到了一个错误?现在看来您的查询是错误的。您的主键是由分区键和范围键组成,还是仅由分区键组成?另外,请记住,使用DynamoDB只能通过分区键获得。对于其他内容,您应该在某些字段上使用scan或更好的全局二级索引,并通过itI进行查询。然后你的选择是把一个GSI放在电子邮件上,如果你想经常查询的话。DynamoDB是一个非常古怪的数据库——请记住这一点。如果查询或getItem无法满足您的请求,您将被迫使用扫描,这是非常昂贵的。仔细设计你的方案,你会有一个好的性能和小的账单:你是对的,我完全没有意识到他使用的不是DocumentClient,而是DynamoDB服务。我已经更新了我的答案以确保完整性,因为我看到他仍然缺少一些东西…我已经做了更改,请参阅我问题中的最新更新,但我得到了一个错误?现在看来您的查询是错误的。您的主键是由分区键和范围键组成,还是仅由分区键组成?另外,请记住,使用DynamoDB只能通过分区键获得。对于其他内容,您应该在某些字段上使用scan或更好的全局二级索引,并通过itI进行查询。然后你的选择是把一个GSI放在电子邮件上,如果你想经常查询的话。DynamoDB是一个非常古怪的数据库——请记住这一点。如果查询或getItem无法满足您的请求,您将被迫使用扫描,这是非常昂贵的。仔细设计您的方案,您将获得良好的性能和较小的开销:我完全没有意识到您使用的不是DocumentClient,而是DynamoDB服务。检查更新的回答我完全没有注意到您使用的不是DocumentClient而是DynamoDB服务。检查更新的答案
data.Items.forEach(function(element, index, array) {
      console.log(element.FristName.S + " " + element.LastName.S);
    });