亚马逊 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 为空”错误。

两件事...

  1. 由于 axios.get 上的承诺,函数本身可能会终止并且 return 在承诺实现之前什么也不做。

    考虑使用 async-await 同步提取 axios.get 调用的结果。

  2. finishReq return 是调用它的函数的响应生成器,而不是处理程序的结果。因此,即使您使用 async-await,将处理程序 return 包装在函数中也会将其重定向,并且不会 return 将其发送到 SDK 以传输到 Alexa。

所以:

async handle(handlerInput)
const res = await axios.get(...)

展开 .thenfinishReq 代码,使其全部在处理程序范围内。

对于可能发现此问题的其他人 post,您的处理程序未返回任何内容;这就是你收到错误的原因。

你需要:

return axios.get("District Link")
            .then(res => {

return finishReq(speakOutput)

你打电话的两个地方finishReq