AWS Lambda 不是 运行 DynamoDB 命令:getItem 或 batchGetItem
AWS Lambda not running DynamoDB commands: getItem or batchGetItem
我正在尝试将 batchGetItem() DynamoDB 函数从我的 table 中获取 return 值。但是,在调用时,它不会执行代码。我通过向代码的各个部分添加日志记录来对此进行测试。我把肉撕掉了,但这是正在执行的代码 (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'。 None 我在 DynamoDB 或 S3 上成功完成了这项工作,所以我一定是做错了什么。我知道我的权限至少对于 DynamoDB 是正确的,因为在不同的 table 中单独执行用户信息的加载函数工作正常。我是在那之后建模的,但是由于我以不同的方式访问它们,所以我不确定我做错了什么。
这是脚本的输出,
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
一切正常。
我找到问题了。我一直在一个函数中调用 storageEvents.loadEvents() ,并且我是从 handleFirstEvent() 函数调用该函数的。由于它不是通过回调完成的,因此该函数在接收到数据之前就退出了。在我的 loadUser() 函数中,这是有效的,因为我使用的是来自主处理程序函数的回调。我现在明白回调必须堆叠才能使用数据。
我正在尝试将 batchGetItem() DynamoDB 函数从我的 table 中获取 return 值。但是,在调用时,它不会执行代码。我通过向代码的各个部分添加日志记录来对此进行测试。我把肉撕掉了,但这是正在执行的代码 (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'。 None 我在 DynamoDB 或 S3 上成功完成了这项工作,所以我一定是做错了什么。我知道我的权限至少对于 DynamoDB 是正确的,因为在不同的 table 中单独执行用户信息的加载函数工作正常。我是在那之后建模的,但是由于我以不同的方式访问它们,所以我不确定我做错了什么。
这是脚本的输出,
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
一切正常。
我找到问题了。我一直在一个函数中调用 storageEvents.loadEvents() ,并且我是从 handleFirstEvent() 函数调用该函数的。由于它不是通过回调完成的,因此该函数在接收到数据之前就退出了。在我的 loadUser() 函数中,这是有效的,因为我使用的是来自主处理程序函数的回调。我现在明白回调必须堆叠才能使用数据。