Javascript Alexa提出问题并从外部API获得响应

Javascript Alexa提出问题并从外部API获得响应,javascript,aws-lambda,alexa-skills-kit,alexa-slot,Javascript,Aws Lambda,Alexa Skills Kit,Alexa Slot,我建立了一个简单的意图 { “交互模型”:{ “语言模型”:{ “银行名称”:“万岁银行”, “意图”:[ …内在的意图{ “姓名”:“询问”, “插槽”:[{ “姓名”:“问题”, “类型”:“AMAZON.SearchQuery” }], “样本”:[ “当{问题}”, “如何{提问}”, “什么{问题}” ] } ], “类型”:[] } } }在AskIntentHandler中,除了检查问题槽外,还应将“canHandle”设置为意图的名称,如下所示 const AskIntentH

我建立了一个简单的意图

{
“交互模型”:{
“语言模型”:{
“银行名称”:“万岁银行”,
“意图”:[
…内在的意图{
“姓名”:“询问”,
“插槽”:[{
“姓名”:“问题”,
“类型”:“AMAZON.SearchQuery”
}],
“样本”:[
“当{问题}”,
“如何{提问}”,
“什么{问题}”
]
}
],
“类型”:[]
}
}

}
在AskIntentHandler中,除了检查问题槽外,还应将“canHandle”设置为意图的名称,如下所示

const AskIntentHandler = {
  canHandle (handlerInput) {
  return handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
      handlerInput.requestEnvelope.request.intent.name === 'AskIntent' &&
      !!handlerInput.requestEnvelope.request.intent.slots['question'].value
  },
  handle (handlerInput) {
     // API Request Here
  }
}
此外,如果总是需要“问题”来运行意图,您可以设置一个对话框,以便Alexa在用户不认识“问题”时询问用户


如果问题时段值对于意图是必需的,并且需要包含意图名称,则可以根据需要设置问题时段值。您可以使用async/await来处理API

const Alexa = require('ask-sdk-core');
const https = require('https');
const querystring = require('querystring');
const { getSlotValue } = Alexa;

const APP_ID = 'amzn1.ask.skill.1234';

const AskIntentHandler = {
  canHandle(handlerInput) {
    return (
      handlerInput.requestEnvelope.request.type === "IntentRequest" &&
      handlerInput.requestEnvelope.request.intent.name === "AskIntent"
    );
  },
  async handle(handlerInput) {
    const question = getSlotValue(handlerInput.requestEnvelope, "question");
    console.log("question ", question);
    const data = await getAnswer(question);
    const speechText = data;
    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .getResponse();
  }
};

const getAnswer = question => {
  const subscription_key = "XXXX";
  let data = {
    simplequery: question,
    channel: "Alexa"
  };
  let get_options = {
    headers: {
      "Subscription-Key": subscription_key
    }
  };
  return new Promise((resolve, reject) => {
    https
      .get(
        "https://fakeapi.com/" + querystring.stringify(data),
        get_options,
        res => {
          console.log("statusCode:", res.statusCode);
          console.log("headers:", res.headers);
          res.on("data", d => {
            responseString += d;
          });

          res.on("end", function(res) {
            var json_hash = JSON.parse(responseString);
            // grab the first answer returned as text and have Alexa read it
            const speechOutput = json_hash["results"][0]["content"]["text"];
            console.log("==> Answering: ", speechOutput);
            resolve(speechOutput);
          });
        }
      )
      .on("error", e => {
        console.error(e);
        resolve("I'm sorry I ran into an error");
      });
  });
};

问题是否与如何调用api
https.get()有关https://fakeapi.com/”)
或如何运行其余代码?在这两种情况下,您为什么要将所有逻辑都包含在问题中,而不是仅发布其中每种问题的简化示例。此外,对您使用的任何文档的引用也会很有用。你也没有很好地解释你的问题是什么。我必须阅读你所有的源代码,以了解Alexa是否拥有这些信息,并且未能将它们返回给你。请相应地改进您的问题。感谢您在cloudwatch中是否注意到您的intentHandler函数是否已执行??我认为这样的回答是因为Alexa无法理解问题的意图。你能发布cloudwatch日志吗?这是目前为止最好的答案