亚马逊 Alexa“AskSdk.RequestEnvelopeUtils 错误:期望请求类型为 IntentRequest 但得到 SessionEndedRequest”

如何解决亚马逊 Alexa“AskSdk.RequestEnvelopeUtils 错误:期望请求类型为 IntentRequest 但得到 SessionEndedRequest”

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

这是应该发生的:

用户打开 i。页。无线电

回声:欢迎收听 IP 广播。你可以让我播放你最喜欢的电台,或者你可以说帮助。

用户播放普通电台

回声:好的,播放 123.4:通用电台(然后播放电台)

但这就是发生的事情。

用户打开 i。页。无线电

回声:欢迎收听 IP 广播。你可以让我播放你最喜欢的电台,或者你可以说帮助。

用户播放普通电台

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

然后这会记录在控制台中:

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 设备上所有正在运行的流并播放该流。

祝大家有个美好的一天!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?