Вызов getItem() для объекта DynamoDB из AWS Lambda, почему мой обратный вызов не выполняется?

Я пытаюсь получить элемент из моей базы данных DynamoDB. Мой код сейчас написан так, что мне не удается получить какие-либо данные из DynamoDB. Должно быть, я делаю что-то не так, потому что, насколько я могу судить по тесту, мой обратный вызов не вызывается.

Вчера я потратил на это весь день и безуспешно возился с этим с тех пор, как проснулся сегодня утром.

Если кто-нибудь может дать представление о том, что я делаю неправильно здесь, я был бы очень благодарен. Спасибо всем заранее!

Последнее замечание: время ожидания самой функции Lambda установлено на 5 минут. Поэтому я не думаю, что функция Lambda истекает до того, как запрос db может вернуться. Когда я запускаю функцию, она завершается через мгновение.

const AWS = require('aws-sdk');

const dynamodb = new AWS.DynamoDB();
var response = null;
var test = false;

function getFromDB(callback) {
  const params = {
    TableName: process.env['DB_TABLE_NAME'] // evaluates to 'test-table',
    Key: {
      "id": {
        S: postId // evaluates to a big string, pulling it in from an SNS message. Verified it with console.log(). It stores the expected value.
      }
    }
  };
  dynamodb.getItem(params, function(err, data) {
    if (err) callback(data, true);           // an error occurred
    else     callback(data, true);           // successful response
  });
}

getFromDB((data, isCalled) => {
    response = data;
    test = isCalled;
});

console.log(data); // evaluates to null
console.log(test); // evaluates to false

person Kevin Glick    schedule 04.12.2017    source источник
comment
Вы проверили свои журналы? В консоли AWS щелкните свою лямбда-функцию, затем щелкните вкладку «Мониторинг», затем нажмите «Просмотр в Cloudwatch». Верхний элемент будет вашим последним журналом выполнения.   -  person F_SO_K    schedule 05.12.2017
comment
Кроме того, на что настроен ваш обработчик?   -  person F_SO_K    schedule 05.12.2017
comment
Ваша функция-обработчик может дополнительно принимать обратный вызов в качестве аргумента, но я думаю, что вы должны принимать событие и контекст. Как эта «функция (событие, контекст, обратный вызов)»   -  person F_SO_K    schedule 05.12.2017
comment
Спасибо, что продолжаете изучать это. Я проверю свои журналы сегодня после работы, чтобы увидеть, может ли это помочь.   -  person Kevin Glick    schedule 06.12.2017
comment
сигнатура обработчика (событие, контекст);   -  person Kevin Glick    schedule 07.12.2017
comment
В журнале CloudWatch говорится, что процесс завершился до завершения запроса   -  person Kevin Glick    schedule 07.12.2017
comment
Это может быть проблемой. Ваш обработчик, вероятно, должен быть (событие, контекст, обратный вызов) — если вы планируете возвращать некоторые данные из Lambda. Можете ли вы опубликовать всю свою функцию?   -  person F_SO_K    schedule 07.12.2017
comment
Кроме того, попробуйте написать отладочную информацию в консоль. Это будет отображаться в cloudwatch, и вы сможете определить, насколько далеко продвинулась ваша функция. Прочтите также это руководство.   -  person F_SO_K    schedule 07.12.2017
comment
Кстати, соответствует ли обработчик в консоли имени обработчика в вашем коде?   -  person F_SO_K    schedule 07.12.2017
comment
1. Пробовали добавить callback(null, "Hello World") в начало — запускается? Если это так, проблема заключается в вашем запросе к базе данных, в противном случае это ваша настройка лямбда. 2. Я считаю, что аргументы по умолчанию для вашего лямбда-обработчика должны быть (event, context, callback).   -  person Daniel Apt    schedule 27.12.2017


Ответы (3)


Я столкнулся с подобной проблемой. Я удалил асинхронность в приведенном ниже заявлении, чтобы решить:

exports.handler = async (event,context) 
person fundoocoder    schedule 01.09.2018

Я думаю, что происходит то, что Lambda вызывает функцию, но не собирается ждать обратного вызова, поэтому думает, что это сделано, и выходит.

Я думаю, что у меня была похожая проблема, и я решил ее с помощью Bluebird и async/await.

Я могу предоставить фрагмент моего кода, если вам это нужно

person Hassan Syyid    schedule 22.12.2017

Вы загрузили SDK? Я не вижу этого в вашем фрагменте кода

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set the region 
AWS.config.update({region: 'REGION'});

РЕДАКТИРОВАТЬ: Включенный регион

person F_SO_K    schedule 04.12.2017
comment
Да, SDK загружен. Я отредактирую свой оригинальный пост, чтобы отразить это. - person Kevin Glick; 04.12.2017
comment
Я не включил оператор AWS.config.update({region: 'REGION'});. Как вы думаете, это может быть причиной моей проблемы? - person Kevin Glick; 04.12.2017
comment
Это возможно. Для Dynamo требуется регион, и я не думаю, что по умолчанию это что-то. Но без трассировки стека трудно понять, в чем может быть ваша проблема. Дайте мне знать, если вам нужна дополнительная информация о регионах. - person F_SO_K; 04.12.2017
comment
Спасибо. Я попробую и посмотрю, решит ли это проблему. - person Kevin Glick; 04.12.2017
comment
Я обновил код, чтобы включить регион, но он все еще не работает. - person Kevin Glick; 05.12.2017