Amazon Alexa "SpeechletResponse fue nulo"

CorePress2024-01-16  9

Esto no se realiza a través de ningún editor de código de terceros. Esto es a través de la Consola de desarrollador de Alexa.

Estoy intentando crear una habilidad para que mi escuela obtenga las actualizaciones actuales si la escuela está cerrada, tiene un retraso de dos horas, etc.

Este es el código que lo maneja:

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();
        }
    }
}

Recibo el mensaje "SpeechletResponse fue nulo" error.



------------------------------------

Dos cosas...

Debido a la promesa en axios.get, la función en sí podría terminar y no devolver nada antes de que se cumpla la promesa.

Considere utilizar async-await para obtener los resultados de la llamada axios.get de forma sincrónica.

finishReq devuelve el generador de respuestas a la función que lo llamó, no como resultado del controlador. Entonces, incluso si usa async-await, envolver el retorno del controlador en una función lo redirige y no lo devuelve al SDK para su transmisión a Alexa.

Entonces:

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

Desenvuelva el código .then y finishReq para que esté todo en el alcance del controlador.

Respondido

20 de marzo de 2021 a las 19:30

LetMyPeopleCode

LetMyPeopleCode

1.905

15

15 insignias de plata

20

20 insignias de bronce

0



------------------------------------

Para otras personas que puedan encontrar esta publicación, su administrador no devuelve nada; es por eso que recibes el error.

Necesitas:

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

y

return finishReq(speakOutput)

para los dos lugares a los que llamas FinishReq.

Respondido

24 de noviembre de 2021 a las 14:50

todos los pies

todos los pies

61

2

2 insignias de bronce

1

¡Guau! Gracias por la respuesta. Es un poco tarde, pero esto definitivamente ayudará a otros cuando reciban este error, porque es muy ambiguo

-IceBotYT

24 de noviembre de 2021 a las 14:57

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare