我正在尝试使用AWS Lambda函数来处理来自SendGrid的事件。据我了解,该事件将是一个数组,其中包含可变数量的JSON对象,每个对象代表一个给定的事件。我想使用batchWriteItem将这些事件写入DynamoDB,并循环执行该过程,直到没有返回任何UnprocessedItems。但是,我陷入了无限循环。现在是我的代码:

console.log('Loading function');

var aws = require('aws-sdk');
var dynamo = new aws.DynamoDB();
params = {};

exports.handler = function(sg_event, context) {

    var items = [];
    for(var i = 0; i < sg_event.length; i++) {
        var obj = sg_event[i];
        var request = {
            PutRequest: {
                Item: {
                    email: { S: obj.email },
                    timestamp: { S: obj.timestamp.toString() },
                    sg_message_id: { S: obj.sg_message_id },
                    event: { S: obj.event }
                }
            }
        };
        items.push(request);
    }

    params = {
        RequestItems: {
            sendgrid_response: items
        }
    }

    do {
        dynamo.batchWriteItem( params, function(err, data) {
            if(err)
                context.fail(err);
            else
                params.RequestItems = data.UnprocessedItems;
        });
    } while(!isEmpty(params.RequestItems));
};

function isEmpty(obj) {
    return (Object.keys(obj).length === 0);
}

我认为问题在于尝试在回调函数中设置参数,但我不知道该怎么做...我知道我可以在原始回调中使用UnprocessedItems调用另一个batchWriteItem ,但我仍然需要能够根据需要多次运行该函数,以确保写入所有UnprocessedItems。如何正确循环batchWriteItem?

最佳答案

@Daniela Miao,感谢您分享解决方案。

我们可以在您发布的代码中添加一个代码块,以避免DynamoDB的异常。这将检查 params.RequestItems 是否具有未处理的数据,然后再请求DynamoDB进行批量写入。

//db is AWS.DynamoDB Client
var processItemsCallback = function(err, data) {
  if (err) {
     //fail
  } else {
    var params = {};
    params.RequestItems = data.UnprocessedItems;
    /*
    * Added Code block
    */
    if(Object.keys(params.RequestItems).length != 0) {
      db.batchWriteItem(params, processItemsCallback);
    }
  }
};

db.batchWriteItem(/*initial params*/, processItemsCallback);

关于javascript - 如何使用AWS JavaScript SDK(dynamoDB)处理UnprocessedItems?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31882002/

10-10 11:32