AWS Lambda未运行DynamoDB命令:getItem或batchGetItem

时间:2018-05-29 18:17:51

标签: javascript amazon-s3 amazon-dynamodb aws-sdk alexa

我试图让batchGetItem()DynamoDB函数从我的表中返回值。但是,在调用时,它不会执行代码。我通过在代码的各个部分添加日志记录来测试它。我撕掉了肉,但这是正在执行的代码(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 :(得分:0)

以下是脚本的输出

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

一切都按预期工作。

答案 1 :(得分:0)

我弄明白了这个问题。我一直在函数中调用storageEvents.loadEvents(),我从handleFirstEvent()函数调用该函数。由于没有使用回调,该函数在接收数据之前就已退出。在我的loadUser()函数中,这是有效的,因为我使用了主处理函数的回调。我现在明白必须堆叠回调以便能够使用数据。