Amazon Alexa "AskSdk.RequestEnvelopeUtils Error: Expecting request type of IntentRequest but got SessionEndedRequest."

Amazon Alexa "AskSdk.RequestEnvelopeUtils Error: Expecting request type of IntentRequest but got SessionEndedRequest."

我正在尝试播放最终用户可以在我的网站上提供的广播电台。

这是应该发生的事情:

用户: 打开 i. p.收音机

Echo: 欢迎使用 IP 广播。你可以让我播放你喜欢的电台,或者你可以说帮助。

用户:播放通用电台

Echo: 好的,正在播放 123.4: Generic Radio Station(然后播放该电台)

但事实就是这样。

用户: 打开 i. p.收音机

Echo: 欢迎使用 IP 广播。你可以让我播放你喜欢的电台,或者你可以说帮助。

用户:播放通用电台

Echo:请求的技能响应有问题。

然后将其记录在控制台中:

2021-04-24T22:31:10.222Z    INFO    ~~~~ Error handled string: AskSdk.RequestEnvelopeUtils Error: Expecting request type of IntentRequest but got SessionEndedRequest.

电台在8443端口。

这是运行的代码:

const PlayStationIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'PlayRadio';
    },
    async handle(handlerInput) {
        function reallyHandle() {
            return new Promise(async (res, rej) => {
                let response = await axios.get("https://msbc.one/api/stations", {headers: {"Authorization": "Bearer " + handlerInput.requestEnvelope.context.System.user.accessToken}})
                if (response.data.length === 0) {
                    const speakOutput = "You have no stations added! You can add stations at, m s b c dot one. Login, and follow the instructions."
                    res(handlerInput.responseBuilder
                        .speak(speakOutput)
                        .getResponse());
                } else {
                    let station_url;
                    let station_title;
                    for (let i = 0; i < response.data.length; i++) {
                        console.log("~~~~ over here! " + response.data[i].command + "\n\n" + handlerInput.requestEnvelope.request.intent.slots.station.value)
                        if (response.data[i].command === handlerInput.requestEnvelope.request.intent.slots.station.value) {
                            station_url = response.data[i].url
                            station_title = response.data[i].title
                        }
                    }
                    if (!station_url) {
                        const speakOutput = "That station does not exist, please try again."
                        res(handlerInput.responseBuilder
                            .speak(speakOutput)
                            .reprompt(speakOutput)
                            .getResponse());
                    } else {
                        const speakOutput = "OK, playing " + station_title + "."
                        const builder = handlerInput.responseBuilder
                        builder.speak(speakOutput)
                        builder.addDirective({
                            type: "AudioPlayer.Play",
                            playBehavior: "ENQUEUE",
                            audioItem: {
                                stream: {
                                    url: station_url,
                                    token: handlerInput.requestEnvelope.request.intent.slots.station.value,
                                    offsetInMilliseconds: 0,
                                }
                            },
                            metadata: {
                                title: station_title,
                                subtitle: "IP Radio",
                            }
                        })
                        res(builder.getResponse())
                    }
                }
            })
        }
        if (!handlerInput.requestEnvelope.context.System.user.accessToken) {
            const speakOutput = "Welcome to IP radio. To use the full features of this skill, please link your account. I've sent a card to your Alexa app with more instructions."
            
            return handlerInput.responseBuilder
                .speak(speakOutput)
                .withLinkAccountCard()
                .getResponse();
        } else {
            let okDoThis = await reallyHandle()
            return okDoThis;
        }
        
    }
};

谢谢你,祝你有愉快的一天。

编辑: 我已经完成并尝试删除 speakOutput,但仍然无法正常工作。还有其他想法吗?

我解决了我的问题,因为我使用了 playBehavior ENQUEUE 而不是 REPLACE_ALL,因为 ENQUEUE 需要一个令牌,因为如果它与之前的令牌不匹配,它就不会工作。 REPLACE_ALL 删除 Echo 设备上的所有 运行 流并播放该流。

祝大家有个愉快的一天!