如何从AWS DynamoDB中的函数返回查询结果-JS lambda
我有一个愚蠢的问题,让我发疯。我有一个AWS lambda函数,可以调用Dynamo db。如何从AWS DynamoDB中的函数返回查询结果-JS lambda
我想有ddb.Scan操作成一个函数得到的结果,然后将它传递给事件,但我不能返回结果的函数内部...
var aws = require('aws-sdk');
var ddb = new aws.DynamoDB();
function getName(userid) {
ddb.scan({
TableName: "Users",
ScanFilter: {
"userid":
{
"AttributeValueList": [
{"S": userid}
],
"ComparisonOperator": "EQ"
}
}
}, function (err, data) {
return data.Items[0].username;
});
};
exports.handler = function (event, context) {
var userid= '4vwe6jd56es59q';
var username = getName(userid);
context.succeed({success: true, username: username});
};
有人可以帮助我了解我迷路的地方?
注意如何声明此功能:
function getName(userid) {
这里的另一个功能:
function (err, data) {
这是第二个功能,即你正在试图返回的东西,但没有什么期待该功能返回任何东西,所以返回值被丢弃。
请注意,对ddb.scan()
的调用立即返回,并且在检索到DynamoDB响应后稍后调用传递给ddb.scan()
的匿名回调函数。这是一个基本的异步编程概念,在成功编写NodeJS代码之前,您必须先了解它。您需要将回调函数传递给您的函数,该函数只要具有名称值即可调用该函数,或者您可能需要重新考虑完全设计Lambda函数的方式。
我还建议使用AWS Lambda上提供的最新版本的NodeJS,以便您可以使用promise而不是回调函数,这使得使用异步函数更容易一些。
我注意到你的代码的第一件事是你的getName
函数实际上并不返回任何东西,所以即使扫描函数按预期工作,它也会返回null。
更重要的是,ddb.scan(...)
是一个异步函数,因此,您必须在回调中嵌入想要完成的所有内容(在本例中为扫描结果)。
这意味着你的代码应该看起来更像是这样的:
var aws = require('aws-sdk');
var ddb = new aws.DynamoDB();
exports.handler = function (event, context) {
var userid= '4vwe6jd56es59q';
var username = getName(userid);
ddb.scan({
TableName: "Users",
ScanFilter: {
"userid":
{
"AttributeValueList": [
{"S": userid}
],
"ComparisonOperator": "EQ"
}
}
}, function (err, data) {
var username = data.Items[0].username
context.succeed({success: true, username: username});
});
};
注意context.succeed现在已嵌入异步回调中,这样,只有当数据已经返回的数据传递。
谢谢迈克尔,但我试图运行它另一种方式,因为这是其他代码的一部分。进入出口。处理程序我有一个foreach,我需要运行查询到每个为了将此查询的结果添加到JSON ...我有第一个查询是你正在建议和每个data.Item结果我需要嵌套第二个查询。 –
非常感谢。这个想法是让它不是异步...我跟随基本查询[链接](http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.JsShell.05.html)查询基于“docClient.scan(params,function(err,data){”。可能我完全在错误的路径上,但这是一个更大的代码的一部分,我在表上有一个主要查询并且我想合并在构建JSON之前从另一个表中获取一些信息... –
'docClient.scan'函数也是异步的。如果您想要编写代码,您将必须以某种方式处理这些AWS API调用的异步性质NodeJS,这个想法可能是“让它不是异步”,但这不是AWS NodeJS SDK给你的选项,也不是真的用来编写NodeJS代码的模型。 –