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日志吗?这是目前为止最好的答案