Javascript 为什么我需要从DynamoDB解析数字?
上周我一直在玩弄AWS,并开始创建一个Lambda和DynamoDB 我花了好几个小时试图弄明白为什么我会遇到可怕的Javascript 为什么我需要从DynamoDB解析数字?,javascript,amazon-dynamodb,Javascript,Amazon Dynamodb,上周我一直在玩弄AWS,并开始创建一个Lambda和DynamoDB 我花了好几个小时试图弄明白为什么我会遇到可怕的提供的关键元素与模式不匹配的错误,最后我崩溃了,投了1,而不是id。令我震惊的是,Lambda终于成功了。更有趣的是,我发现我需要做parseInt(id) 有人能解释一下原因吗?下面是我更新列的简单Lambda var AWS = require('aws-sdk'); AWS.config.update({region: 'us-east-1'}); var ddb = ne
提供的关键元素与模式不匹配的错误,最后我崩溃了,投了1
,而不是id
。令我震惊的是,Lambda终于成功了。更有趣的是,我发现我需要做parseInt(id)
有人能解释一下原因吗?下面是我更新列的简单Lambda
var AWS = require('aws-sdk');
AWS.config.update({region: 'us-east-1'});
var ddb = new AWS.DynamoDB;
var docClient = new AWS.DynamoDB.DocumentClient();
function updateField(id) {
var params = {
TableName: 'MyTable',
Key: {
'Id': parseInt(id)
},
UpdateExpression: `SET #c = :val`,
ExpressionAttributeNames: {
'#c': 'MyField'
},
ExpressionAttributeValues: {
":val": 1
},
ReturnValues: "UPDATED_NEW"
};
docClient.update(params, function(err, data) {
if (err) {
console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
} else {
console.log("Updated");
}
});
}
exports.handler = function(event, context) {
ddb.scan({
TableName: 'MyTable',
Limit: 1
}, function(err, data) {
if (err) {
console.log("Error", err);
} else {
var item = data.Items[0];
updateField(item.Id.N);
}
});
};
我正在从DynamoDB读取Id
值,并使用N
属性。为什么我需要将其解析为int以重用它?这是我未能理解JavaScript中如此简单的东西,还是DynamoDB做了我不期望的事情
//Works
Key: {
'Id': parseInt(id)
}
//Does not work even though id came right from the database
Key: {
'Id': id
}
直接来自AWS.DynamoDB
和AWS.DynamoDB.DocumentClient
的响应之间存在很大差异。简而言之,前者将以字符串形式返回数字,而后者将以数字形式返回数字
您正在同时使用这两种方法,而您可能应该只使用一种方法来避免类似这样的问题
var ddb = new AWS.DynamoDB;
var docClient = new AWS.DynamoDB.DocumentClient();
DocumentClient
简化了“纯”DynamoDB调用。从其:
[DocumentClient]注释作为输入参数提供的本机JavaScript类型,并将注释后的响应数据转换为本机JavaScript类型
但是,当您在更新中使用它时,您没有在扫描中使用DocumentClient
。相反,您将直接使用AWS.DynamoDB
和ddb.scan()
。这将返回与DocumentClient不同的格式结果(有些反直觉)。特别是,从its(在“响应语法”下查看)中,我们可以看到数字作为字符串返回:
“N”:“字符串”
因此,您可以继续将字符串转换为数字,或者,最好是使用DynamoDB.DocumentClient
与DynamoDB进行所有常见的交互,因为它是为了更好地与Node/Javascript集成而设计的。我认为这实际上是一个合理的解释,但是你能添加你用来从DynamoDB获取数据的代码吗?这样我就不会猜错了,拜托?@Michael sqlbot很抱歉这么晚才回复,但是代码就在那里。底部的export.handler
函数就是这样!真尴尬。我想我是希望它在上面,而不是在下面,并且没有像我应该注意的那样多。啊。。感谢您链接该请求文档并花费您的时间。现在一切都变得完全有意义了。我肯定会使用DocumentClient
。