Alexa技能异步等待从DynamoDB提取数据

时间:2019-03-16 00:40:48

标签: node.js async-await amazon-dynamodb alexa alexa-skill

以下代码是我的Alexa技能中的启动处理程序,并且在处理程序内部有一个名为x的变量。我试图将x设置为从dynamoDB获取的数据,并在get函数(我从https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.03.html#GettingStarted.NodeJs.03.02获得函数)之外使用它,以便Alexa可以说出x的值(字符串)(如您在返回中看到的)。我的“ get”函数中的语句未在get函数本身之外更改x的值。我知道get函数内部的x实际上已被更改,因为我正在将它记录到控制台。因此,我对此发表了类似的帖子,最初我认为这是一个范围问题,但事实证明这是因为get函数是异步的。因此,我添加了async和await关键字,如下所示。根据我的研究,我是NodeJS的新手,所以我认为应该把它们放在那里。但是,这仍然无法正常工作。

const LaunchHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === `LaunchRequest`;
  },
  async handle(handlerInput) {
    var x;

    //DYNAMO GET FUNCTION
    await DBClient.get(params, function(err, data) {
    if (err) {
        console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
    } else {
         x = data.Item.Answer;
    } }); 

    return handlerInput.responseBuilder
      .speak(x)
      .withShouldEndSession(false)
      .getResponse();
  },
};

作为旁注,这是我(成功地)从数据库返回的JSON:

{
    "Item": {
        "Answer": "Sunny weather",
        "Question": "What is the weather like today"
    }
}  

1 个答案:

答案 0 :(得分:0)

您是否正在寻找类似的东西?在handle函数中,我调用另一个函数getSpeechOutput来创建一些反馈文本。因此该函数调用dynamodb函数getGA来获取用户数据

const getSpeechOutput = async function (version) {
  const gadata = await ga.getGA(gaQueryUsers, 'ga:users')

  let speechOutput;
  ...
  return ...
}

const UsersIntentHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'UsersIntent';
  },
  async handle(handlerInput) {
    try {
      let speechOutput
     ...
        speechOutput = await getSpeechOutput("long");
     ...

      return handlerInput.responseBuilder
        .speak(speechOutput)
        .reprompt("Noch eine Frage?")
        .withSimpleCard(defaulttext.SKILL_NAME, speechOutput)
        .getResponse();

    } catch (error) {
      console.error(error);
    }
  },
};

那是db函数:

const getUser = async function (userId) {
    const dynamodbParams = {
        TableName: process.env.DYNAMODB_TABLE_BLICKANALYTICS,
        Key: {
            id: userId
        }
    }
    return await dynamoDb.get(dynamodbParams).promise()
}