在完成请求之前退出流程(Lambda + DynamoDB)

Jam*_*esG 1 json amazon-web-services amazon-dynamodb aws-lambda

出于某种原因,我在完成请求错误之前退出了进程.

这是我的代码:

var http = require('http');
var aws = require('aws-sdk');
var ddb = new aws.DynamoDB();

function getUser(userid) {
    var q = ddb.getItem({
        TableName: "clients",
        Key: {
            ClientID: { S: userid } }
        }, function(err, data) {
            if (err) {
                console.log(err);
                return err;
            }
            else {
                console.log(data);
            }
    });
    //console.log(q);
}


exports.handler = function(event, context) {
    getUser('user23');
    console.log("called DynamoDB");

};
Run Code Online (Sandbox Code Playgroud)

谷歌搜索后,有人建议将时间更改为更高的金额.我做了一分钟.

但是这个功能只采用了:

持续时间:2542.23毫秒

我还检查并仔细检查了表名和密钥名称等...

控制台日志有:

2016-03-21T04:09:46.390Z - 收到活动

2016-03-21T04:09:46.751Z - 名为DynamoDB

2016-03-21T04:09:47.012Z - {}

END RequestId:id123

任何人都可以看到为什么这不起作用?

编辑

根据下面的答案我试过:

    console.log('Loading event');
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = function(event, context) {
    console.log(JSON.stringify(event, null, '  '));
    dynamodb.listTables(function(err, data) {
      console.log(JSON.stringify(data, null, '  '));
    });
    var tableName = "clients";
    var datetime = new Date().getTime().toString();
    dynamodb.getItem({
        TableName: tableName,
        Key: {
            ClientID: { S: "gr5f4sgnca25hki" } }

    }, function(err, data) {
        if (err) {
            context.done('error','putting item into dynamodb failed: '+err);
        }
        else {
            context.done(data);
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

但现在我的回答是:

"errorMessage":"[object Object]"

我想要做的是:检查项目是否存在于数据库中.从条目中获取参数(如果存在),然后使用参数执行某些操作

  • 谁能帮我?

Mat*_*ero 5

首先,context.done期望一个Error对象作为第一个参数,而不是包含该单词的字符串"error".其次,如果Error对象为null或未定义,则终止将被视为成功.

现在,考虑一下你的回调函数:

function (err, data)
{
    if (err) {
       context.done('error', 'putting item into dynamodb failed: ' + err);
    }
    else {
       context.done(data);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你有一个错误,那么你的lambda将在一个失败中终止,这是预期的,但errorMessage你会得到的只是"error",这没有多少信息.

如果没有错误,那么你的拉姆达也将终止在一个失败,因为你传递data第一个参数context.done,记住第一个参数总是Error对象.

要解决此问题,您只需执行以下操作:

function (err, data)
{
    if (err) {
       context.done(err);
    } else {
       context.done(null, data);
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至更好:

function (err, data)
{
    context.done(err, data);
}
Run Code Online (Sandbox Code Playgroud)

如果您不想处理该项并立即返回它,则可以将其context.done用作DynamoDB操作的回调函数:

dynamodb.getItem({
    TableName: tableName,
    Key: {
        ClientID: { S: "gr5f4sgnca25hki" }
    }
}, context.done);
Run Code Online (Sandbox Code Playgroud)