Я пытаюсь заставить функцию 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.info('loadEvents');
dynamodb.batchGetItem({
RequestItems: {
'EventsData': {
Keys: [
{'country': {S: 'USA'}}
],
}
}
}, function (err, data) {
console.info('batchGetItem');
var currentEventsList = "test";
callback(currentEventsList);
});
},
loadEvent: function(session, callback) {
console.info('loadEvent');
dynamodb.getItem({
TableName: 'EventsData',
Key: { event_name: { S: 'Fun Event' } }
}, function (err, data) {
console.info('getItem');
var currentEventsList = "test";
callback(currentEventsList);
});
},
loadS3events: function(session, callback) {
console.info('loadS3events');
s3.getObject({
Bucket: myBucket,
Key: myObject
}, function(err, data) {
console.info('getObject');
var currentEventsList = "test";
callback(currentEventsList);
});
}
};
})();
module.exports = storageEvents;Вот как он вызывается из index.js:
var storageEvents = require('./storageEvents');
storageEvents.loadEvents(session, function (currentEventsList) {
console.info("getEventsFromDynamoDb currentEventsList: " + currentEventsList);
eventList = currentEventsList;
});Остальные функции вызываются аналогично. Когда это выполняется, я вижу в журналах CloudWatch «loadEvents», но никогда не вижу «batchGetItem». Ни одна из моих попыток выполнить эту работу для DynamoDB или S3 не увенчалась успехом, поэтому я должен делать что-то не так. Я знаю, что мои разрешения верны, по крайней мере, для DynamoDB, потому что отдельное выполнение функции загрузки для пользовательской информации в другой таблице работает нормально. Я смоделировал это после этого, но, поскольку я обращаюсь к ним по-другому, я не уверен, что делаю не так.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вот результат скрипта,
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
Все работает как положено.
Я также только что подтвердил, что session.sessionId одинаков на каждом шаге, включая loadEvents, поэтому он определенно не пропускает сеанс.
Просто запустите сценарий, и вы получите результат. Также вы не регистрировали никаких ошибок, поэтому ошибки не будут регистрироваться.
Это выполняется в навыке Alexa в AWS Lambda. Я не просто запускаю это из командной строки.
Я разобрался в проблеме. Я вызывал storageEvents.loadEvents () внутри функции, и я вызывал эту функцию из функции handleFirstEvent (). Поскольку это не выполнялось с помощью обратного вызова, функция завершалась до получения данных. В моей функции loadUser () это работало, потому что я использовал обратный вызов из функции основного обработчика. Теперь я понимаю, что обратные вызовы должны быть сложены, чтобы можно было использовать данные.
Я не уверен, что понимаю. сессия в этом случае передается из намерения. Как вы получили вышеуказанный результат? Я не вижу журналов уровня ошибок, которые говорят мне, что пошло не так.