【问题标题】:AWS Lambda Skill Handler returns before database Get is completeAWS Lambda 技能处理程序在数据库获取完成之前返回
【发布时间】:2019-03-28 14:16:22
【问题描述】:

我已经编写了我的第一个 Lambda 来处理 Alexa 技能。

我的问题是对数据库的调用显然是异步的(我可以从 Console.log 消息在 Cloud Log 中出现的顺序看出。

这是我的处理程序。 如何做到让从数据库中获取数据后返回?

const RemindMeHandler = {
   canHandle(handlerInput) {
     const request = HandlerInput.requestEnvelope.request;
     return request.type === 'LaunchRequest'
       || (request.type === 'IntentRequest'
          && 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  ========== */

【问题讨论】:

    标签: aws-lambda alexa


    【解决方案1】:

    您可以包装异步并返回一个承诺,然后使用 async/await 语法来获取数据。您可以检查以下内容。请注意它未经测试。

    const RemindMeHandler = {
      canHandle(handlerInput) {
        return (
          handlerInput.requestEnvelope.request.type === "LaunchRequest" ||
          (handlerInput.requestEnvelope.request.type === "IntentRequest" &&
            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);
          }
        });
      });
    }
    

    【讨论】:

    • 做到了。塔
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多