首页 > 解决方案 > Amazon Alexa“AskSdk.RequestEnvelopeUtils 错误:需要 IntentRequest 的请求类型,但得到了 SessionEndedRequest。”

问题描述

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

这是应该发生的事情:

用户:打开 ip radio

Echo:欢迎来到 IP 电台。你可以让我播放你最喜欢的电台,也可以说帮助。

用户:播放通用电台

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

但这就是发生的事情。

用户:打开 ip radio

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,仍然无法正常工作。还有其他想法吗?

标签: node.jsalexaalexa-skills-kitalexa-skill

解决方案


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

祝大家拥有美好的一天!


推荐阅读