node.js - 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,仍然无法正常工作。还有其他想法吗?
解决方案
我解决了我的问题,因为我使用了 playBehaviorENQUEUE
而不是REPLACE_ALL
,因为ENQUEUE
需要一个令牌,因为如果它与之前的令牌不匹配,它就不起作用。REPLACE_ALL
删除 Echo 设备上所有正在运行的流并播放该流。
祝大家拥有美好的一天!
推荐阅读
- c# - 使用多个 where 的实体框架 Linq 查询
- android - Web 身份验证:无法使用指纹进行身份验证
- python - 没有多索引返回的 Pandas 数据透视表
- flutter - Flutter Stepper 最后一步没有完全滚动
- gradle - 内部 API 构造函数 DefaultDomainObjectSet(Class
) 已被弃用。这计划在 Gradle 7.0 中删除 - java - 使用 Java 流转换具有多个 if/else 的经典嵌套循环
- javascript - 可选的链接逻辑
- python - 在模板中返回 ManyRelatedManager 值
- c++ - 在 C++ 中,如果文件不存在,如何安全地创建文件,但如果文件存在则不打开它?
- reactjs - Context 的 Provider 默认值函数被调用,而不是 Provider 内部的函数