Обработчик навыков AWS Lambda возвращается до завершения получения базы данных

#aws-lambda #alexa

#aws-lambda #alexa

Вопрос:

Я написал свой первый Lambda для обработки навыков Alexa.

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

Вот мой обработчик. Как мне сделать так, чтобы возврат происходил после получения данных из базы данных?

 const RemindMeHandler = {
   canHandle(handlerInput) {
     const request = HandlerInput.requestEnvelope.request;
     return request.type === 'LaunchRequest'
       || (request.type === 'IntentRequest'
          amp;amp; request.intent.name === 'RemindMeIntent');
},
handle(handlerInput) {

   console.log('Started Reminder');

   var thing="Nothinbg";

/* ========== Read dB ========== */

   const params = 
   {
       TableName: 'ItemsToRecall',
       Key: {
          'Slot': {S: '1'}
         },
   };


   readDynamoItem(params, myResult=>
   {
      console.log('Reminder Results:  '   myResult.data);

      thing="Captain";
      console.log('thing 1:  '   thing);   
   });

   console.log('Ended Reminder');

   function readDynamoItem(params, callback) 
   {

       var AWS = require('aws-sdk');
       AWS.config.update({region: 'eu-west-1'});

       var docClient = new AWS.DynamoDB();

       console.log('Reading item from DynamoDB table');

       docClient.getItem(params, function (err, data) 
       {
          if (err) {
              callback(err, data);
           } else {
              callback('Worked', data);
           }
       });
}

/* ========== Read dB End ========== */
console.log('thing 2:  '   thing);
return handlerInput.responseBuilder
  .speak(REMINDER_ACKNOWLEDGE_MESSAGE   thing)
  .getResponse();

}
};
/* ========== Remind Handler End  ========== */
  

Ответ №1:

Вы можете обернуть асинхронность и вернуть обещание, а затем использовать синтаксис async / await для получения данных. Вы можете проверить следующее. Обратите внимание, что это не тестировалось.

 const RemindMeHandler = {
  canHandle(handlerInput) {
    return (
      handlerInput.requestEnvelope.request.type === "LaunchRequest" ||
      (handlerInput.requestEnvelope.request.type === "IntentRequest" amp;amp;
        handlerInput.requestEnvelope.request.intent.name === "RemindMeIntent")
    );
  },
  async handle(handlerInput) {
    console.log("Started Reminder");
    let thing = "Nothinbg";
    const params = {
      TableName: "ItemsToRecall",
      Key: {
        Slot: { S: "1" }
      }
    };
    const data = await readDynamoItem(params);
    console.log("Reminder Results:  ", data);
    thing = "Captain";
    let speechText = thing;
    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .getResponse();
  }
};

function readDynamoItem(params) {
  const AWS = require("aws-sdk");
  AWS.config.update({ region: "eu-west-1" });
  const docClient = new AWS.DynamoDB();
  console.log("Reading item from DynamoDB table");
  return new Promise((resolve, reject) => {
    docClient.getItem(params, function(err, data) {
      if (err) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
}
  

Комментарии:

1. Это сделало это. Ta