我在DynamoDB上还很陌生,我只是创建了一个表,在其中插入了一些虚拟行以测试读/写功能。
这是我的数据。
我通过分区键ok排序键创建了一个Lambda来访问这些数据,但是每次我都返回null:'(
这是我的lambda的代码:
const dynamodb = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10', region: 'eu-west-1'});
exports.handler = async (event,context,callback) => {
var params = {
TableName : "DontMissAPlaceTable",
KeyConditionExpression: "Partition_Key = :id",
ExpressionAttributeValues: {
":id": {"S" : "media_001"}
}
};
dynamodb.query(params, function(err, data) {
if (err) {
console.log(err, err.stack);
callback(null, {
statusCode: '500',
body: err
});
} else {
console.log(data)
callback(null, {
statusCode: '200',
body: data
});
}
})
};
我首先认为这是无法访问表,但似乎我拥有正确的权限。
我很确定这是一个虚拟问题,但我不知道...
感谢您的帮助:D
答案 0 :(得分:3)
您的Lambda函数为async
,但您的代码使用回调。在到达回调之前,您的函数已经终止,因为它是异步运行的。
不要使用过时的,令人困惑的回调方法,而要坚持使用async/await。适用于Node.js的AWS开发工具包已经提供了.promise()
方法,您可以在使用回调的异步方法上调用它,从而使其与await
之间实现无缝连接。
也就是说,将您的代码更改为:
const dynamodb = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10', region: 'eu-west-1'});
exports.handler = async (event) => {
const params = {
TableName : "DontMissAPlaceTable",
KeyConditionExpression: "Partition_Key = :id",
ExpressionAttributeValues: {
":id": "media_001"
}
};
return {
statusCode: 200,
body: JSON.stringify(await dynamodb.query(params).promise())
}
};
由于您已经在使用DocumentClient API,因此在查询时无需指定类型(“ S”,“ N”等)。
另外,请确保Partition_Key
确实是您的您的分区键。您使用表中定义的名称,而不使用HashKey
或PartitionKey
,这意味着如果您调用哈希键id
,则应使用id
。