亚马逊 Alexa "SpeechletResponse was null"
Amazon Alexa "SpeechletResponse was null"
这不是通过任何第三方代码编辑器。这是通过 Alexa 开发者控制台实现的。
我正在尝试为我的学校创建一项技能,以便在学校关闭、延迟两小时等情况下获取当前更新。
这是处理它的代码:
const GetCurrentUpdateHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'GetCurrentUpdate'
},
handle(handlerInput) {
let speakOutput = ""
axios.get("District Link")
.then(res => {
const dom = new JSDOM(res.data)
const msgs = dom.window.document.getElementById("onscreenalert-ctrl-msglist")
const useless = msgs.querySelectorAll("input")
useless.forEach(function (el) {
el.parentNode.removeChild(el)
})
const message = msgs.innerText
if (message === undefined) {
console.log("no messages")
speakOutput = "There are currently no messages."
finishReq(speakOutput)
} else {
console.log("message")
speakOutput = `Here is a message from District. ${msgs.innerText}`
finishReq(speakOutput)
}
})
function finishReq(output) {
return handlerInput.responseBuilder
.speak(output)
.getResponse();
}
}
}
我收到“SpeechletResponse 为空”错误。
两件事...
由于 axios.get
上的承诺,函数本身可能会终止并且 return 在承诺实现之前什么也不做。
考虑使用 async-await
同步提取 axios.get
调用的结果。
finishReq
return 是调用它的函数的响应生成器,而不是处理程序的结果。因此,即使您使用 async-await
,将处理程序 return 包装在函数中也会将其重定向,并且不会 return 将其发送到 SDK 以传输到 Alexa。
所以:
async handle(handlerInput)
const res = await axios.get(...)
展开 .then
和 finishReq
代码,使其全部在处理程序范围内。
对于可能发现此问题的其他人 post,您的处理程序未返回任何内容;这就是你收到错误的原因。
你需要:
return axios.get("District Link")
.then(res => {
和
return finishReq(speakOutput)
你打电话的两个地方finishReq
。
这不是通过任何第三方代码编辑器。这是通过 Alexa 开发者控制台实现的。
我正在尝试为我的学校创建一项技能,以便在学校关闭、延迟两小时等情况下获取当前更新。
这是处理它的代码:
const GetCurrentUpdateHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'GetCurrentUpdate'
},
handle(handlerInput) {
let speakOutput = ""
axios.get("District Link")
.then(res => {
const dom = new JSDOM(res.data)
const msgs = dom.window.document.getElementById("onscreenalert-ctrl-msglist")
const useless = msgs.querySelectorAll("input")
useless.forEach(function (el) {
el.parentNode.removeChild(el)
})
const message = msgs.innerText
if (message === undefined) {
console.log("no messages")
speakOutput = "There are currently no messages."
finishReq(speakOutput)
} else {
console.log("message")
speakOutput = `Here is a message from District. ${msgs.innerText}`
finishReq(speakOutput)
}
})
function finishReq(output) {
return handlerInput.responseBuilder
.speak(output)
.getResponse();
}
}
}
我收到“SpeechletResponse 为空”错误。
两件事...
由于
axios.get
上的承诺,函数本身可能会终止并且 return 在承诺实现之前什么也不做。考虑使用
async-await
同步提取axios.get
调用的结果。finishReq
return 是调用它的函数的响应生成器,而不是处理程序的结果。因此,即使您使用async-await
,将处理程序 return 包装在函数中也会将其重定向,并且不会 return 将其发送到 SDK 以传输到 Alexa。
所以:
async handle(handlerInput)
const res = await axios.get(...)
展开 .then
和 finishReq
代码,使其全部在处理程序范围内。
对于可能发现此问题的其他人 post,您的处理程序未返回任何内容;这就是你收到错误的原因。
你需要:
return axios.get("District Link")
.then(res => {
和
return finishReq(speakOutput)
你打电话的两个地方finishReq
。