Лямбда-функция заканчивается после вызова DynamoDB с помощью обещаний, но не возвращает ошибок? - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть лямбда-функция, обращающаяся к DynamoDB, использующая обещания. Я не получаю ошибок, но функция не перемещается после вызова в Динамо. Подобные вопросы, которые я нашел, казалось, были решены с помощью обещаний, поэтому я чувствую, что это новый вопрос.

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

Вот моя вспомогательная функция динамо:

let AWS = require("aws-sdk");
let dynamo = new AWS.DynamoDB.DocumentClient({
  region: 'us-east-1'
});
//let dynamo = new AWS.DynamoDB() //This may get rid of the execption but gotta make it work. Think I have to wrap the data witht the types in dynamo
//let dynamoPromise = dynamo.promise()
let dynamoHelper = function() {
  return {
    putObject: function(tableName, object) { //,callback I took callback out of the params
      let params = {
        "TableName": tableName,
        "Item": object
      };

      let dynamoPromise = dynamo.put(params).promise()

      return dynamoPromise;
    },
    getRoom: function(tableName, deviceId) { //,callback I took callback out of the params
      console.log("inside the dynamoHelper.getRoom function")
      let params = {
        "TableName": tableName,
        "Key": {
          "deviceId": deviceId
        },
        "AttributesToGet": [
          "roomNumber"
        ]
      };
      let dynamoPromise = dynamo.get(params).promise() //? 
      console.log("After the get call to dynamo still inside dynamo helper")
      return dynamoPromise;
    }
  }
}();
module.exports = dynamoHelper;

Вот где я называю это в index.js:

let dynamoGetPromise = dynamoHelper.getRoom(config.room_lookup_dynamodb_table, deviceId) //took the callback out of the args and put it in then. Will have to do the same for the one that is contained inside the then.
    dynamoGetPromise
      .then(
        function(data) {
          console.log("Data: " + JSON.stringify(data));
          if ('Item' in data) {
            roomNumber = data.Item.roomNumber;
          } else {
            roomNumber = 9999;
          }

...........

Это console.log("Data: " + JSON.stringify(data)); утверждение никогда не достигается, но, опять же, ошибок нет. Не должно быть проблемы тайм-аута, так как мой вывод Lambda говорит, что расчетная продолжительность составляет всего 700 мс ...

Вот мой лямбда-вывод:

START RequestId: e57c0e7a-bdf2-4e20-869b-44babf834dfd Version: $LATEST 2019-04-04T14:30:52.075Z e57c0e7a-bdf2-4e20-869b-44babf834dfd Warning: Application ID is not set 2019-04-04T14:30:52.193Z e57c0e7a-bdf2-4e20-869b-44babf834dfd { canHandle: [Function: canHandle], handle: [Function: handle] } 2019-04-04T14:30:52.254Z e57c0e7a-bdf2-4e20-869b-44babf834dfd ||| New Session ||| 2019-04-04T14:30:52.254Z e57c0e7a-bdf2-4e20-869b-44babf834dfd Device ID: amzn1.ask.device.AEH2LHYGV7GSPP5THMR5H56AI2OOMAQ7MF54CZ3E6WR433WGS6QAOCYCKJWRJ3TQY5IE76NWR2IKCANB6TJNKLDEZOO2YN6ACUVT33MKSS4CO6R7GJI6GDFLOBOPUA2IXX7RI732UXJ6PDST5KYC7CSQK634K4APEBRNVOKVZIDECOCBBIFB4 2019-04-04T14:30:52.254Z e57c0e7a-bdf2-4e20-869b-44babf834dfd New Intent Time: 2019-04-04T10:30:52-04:00 2019-04-04T14:30:52.254Z e57c0e7a-bdf2-4e20-869b-44babf834dfd inside the dynamoHelper.getRoom function END RequestId: e57c0e7a-bdf2-4e20-869b-44babf834dfd REPORT RequestId: e57c0e7a-bdf2-4e20-869b-44babf834dfd Duration: 693.31 ms Billed Duration: 700 ms Memory Size: 128 MB Max Memory Used: 74 MB

Спасибо за любую помощь!

Обновление:

Добавлен оператор catch непосредственно в вызов Dynamo.get, но больше нет информации:

let dynamoPromise = dynamo.get(params).promise().catch(function(reason){console.log("Reason: " + reason)});

Update2:

Попытка избавиться от IIFE и превратить их в асинхронные функции, удерживаемые в объекте. Те же результаты.

Попробовал предложение @ alex067 ниже, но результаты те же.

Обновление3:

Я решил ~ 90% своей проблемы, используя async / await.

1 Ответ

0 голосов
/ 05 апреля 2019

Я использовал async и await, и это решило проблему с неполным выполнением функции. У меня все еще есть проблема, но я опубликую новый вопрос для этого при необходимости.

...