AWS Lambda не выполняет команды DynamoDB: getItem или batchGetItem - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь получить функцию DynamoDB batchGetItem () для возврата значений из моей таблицы.Однако при вызове он не выполняет код.Я проверил это, добавив логирование в различные разделы кода.Я вырвал мясо, но это исполняемый код (storageEvents.js):

'use strict';
var AWS = require("aws-sdk");

var storageEvents = (function () {
    var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10', region: 'us-east-1'});
    var s3 = new AWS.S3({apiVersion: '2012-08-10', region: 'us-east-1'});

    var myBucket = 'my.events';
    var myObject = 'events.txt';

    return {
        loadEvents: function (session, callback) {
            console.log('loadEvents');
            dynamodb.batchGetItem({
                RequestItems: {
                  'EventsData': {
                    Keys: [
                      {'country': {S: 'USA'}}
                    ],
                  }
                }
            }, function (err, data) {
                console.log('batchGetItem');
                var currentEventsList = "test";
                callback(currentEventsList);
            });
        },
        loadEvent: function(session, callback) {
            console.log('loadEvent');
            dynamodb.getItem({
                TableName: 'EventsData',
                Key: { event_name: { S: 'Fun Event' } }
            }, function (err, data) {
                console.log('getItem');
                var currentEventsList = "test";
                callback(currentEventsList);
            });
        },
        loadS3events: function(session, callback) {
            console.log('loadS3events');
            s3.getObject({
                Bucket: myBucket,
                Key: myObject
            }, function(err, data) {
                console.log('getObject');
                var currentEventsList = "test";
                callback(currentEventsList);
            });
        }
    };
})();
module.exports = storageEvents;

Вот как он вызывается из index.js:

var storageEvents = require('./storageEvents');

storageEvents.loadEvents(session, function (currentEventsList) {
    console.log("getEventsFromDynamoDb currentEventsList: " + currentEventsList);
    eventList = currentEventsList;
});

Другие функции вызываются аналогично.Когда это выполняется, я вижу в журналах CloudWatch «loadEvents», но никогда не вижу «batchGetItem».Ни одна из моих попыток сделать эту работу не была успешной для DynamoDB или S3, поэтому я должен что-то делать не так.Я знаю, что мои разрешения правильны по крайней мере для DynamoDB, потому что отдельное выполнение функции загрузки для пользовательской информации в другой таблице работает нормально.Я смоделировал это после этого, но так как я обращаюсь к ним по-другому, я не уверен, что делаю неправильно.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Я разобрался в проблеме.Я вызывал storageEvents.loadEvents () внутри функции и вызывал эту функцию из функции handleFirstEvent ().Поскольку это не было сделано с обратным вызовом, функция завершала работу до того, как получила данные.В моей функции loadUser () это работало, потому что я использовал обратный вызов из основной функции-обработчика.Теперь я понимаю, что обратные вызовы должны быть сложены, чтобы иметь возможность использовать данные.

0 голосов
/ 30 мая 2018

Вот вывод в сценарии,

ReferenceError: session is not defined
    at Object.<anonymous> (/home/ec2-user/testing/test/index.js:3:26)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)
    at startup (node.js:134:18)
    at node.js:962:3

После определения сеанса, вот вывод.

loadEvents
batchGetItem
getEventsFromDynamoDb currentEventsList: test

Все работает как положено.

...