DynamoDB:查询总是返回 null
DynamoDB : Query always returning null
我是 DynamoDB 的新手,我只是创建了一个 table,我在其中插入了一些虚拟行,只是为了测试读/写功能。
这是我的数据。
我创建了一个 Lambda 来访问这些数据,通过 Partition Key ok Sort Key 但我每次都得到一个 null return :'(
这是我的 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
});
}
})
};
我最初以为是无法访问 table,但似乎我拥有正确的权限。
我很确定这是一个虚拟问题,但我无法弄清楚...
感谢帮助:D
您的 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
确实是 您的 分区键。您使用您在 table 中定义的名称,而不是 HashKey
或 PartitionKey
,这意味着如果您调用哈希键 id
,则应使用 id
。
我是 DynamoDB 的新手,我只是创建了一个 table,我在其中插入了一些虚拟行,只是为了测试读/写功能。
这是我的数据。
我创建了一个 Lambda 来访问这些数据,通过 Partition Key ok Sort Key 但我每次都得到一个 null return :'(
这是我的 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
});
}
})
};
我最初以为是无法访问 table,但似乎我拥有正确的权限。
我很确定这是一个虚拟问题,但我无法弄清楚...
感谢帮助:D
您的 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
确实是 您的 分区键。您使用您在 table 中定义的名称,而不是 HashKey
或 PartitionKey
,这意味着如果您调用哈希键 id
,则应使用 id
。