Javascript 在特定状态下启动Alexa技能 早些时候,我遇到了Alexa不把状态变回空白状态的问题。为了完全避免这个问题,我决定强制我的技能总是从START\u模式开始
我将其用作参考,他们通过在第55行执行Javascript 在特定状态下启动Alexa技能 早些时候,我遇到了Alexa不把状态变回空白状态的问题。为了完全避免这个问题,我决定强制我的技能总是从START\u模式开始,javascript,node.js,alexa-skills-kit,alexa-skill,Javascript,Node.js,Alexa Skills Kit,Alexa Skill,我将其用作参考,他们通过在第55行执行alexa.execute()之前执行alexa.state=constants.states.START来设置技能状态。但是,当我在代码中执行相同的操作时,它就不起作用了 以下是我目前的技能: exports.newSessionHandler = { LaunchRequest () { this.hander.state = states.START; // Do something } }; ex
alexa.execute()
之前执行alexa.state=constants.states.START
来设置技能状态。但是,当我在代码中执行相同的操作时,它就不起作用了
以下是我目前的技能:
exports.newSessionHandler = {
LaunchRequest () {
this.hander.state = states.START;
// Do something
}
};
exports.stateHandler = Alexa.CreateStateHandler(states.START, {
LaunchRequest () {
this.emit("LaunchRequest");
},
IntentA () {
// Do something
},
Unhandled () {
// Do something
}
});
我正在使用Bespoken工具
用Mocha
测试这项技能,当我直接输入IntentA
时,就像这样:
alexa.intended("IntentA", {}, function (err, p) { /*...*/ })
测试抱怨,错误:没有为事件定义“Unhandled”函数:Unhandled
。从我所收集到的,这只能意味着在启动时的技能处于空白状态(因为我没有定义任何<代码>未处理的//代码>该状态),这必须意味着<代码> Alexa。但这让我想知道他们是如何在上面的示例代码中实现的
我想解决这个问题的一个办法是,通过执行以下操作,为我希望在START\u模式下的每个意图创建一个别名:
IntentA () {
this.handler.state = states.START;
this.emitWithState("IntentA");
}
但我想知道是否有办法迫使我的技能从一个特定的状态开始,因为在我看来,这是一个更好的解决方案。问题是,当你收到一个启动请求时,你发现没有状态。如果你看一下官方的Alexa示例,你会发现他们解决这个问题的方法是按照你说的做,为他们的所有意图创建一个“别名”意图,然后使用它们来更改状态,然后使用“emitWithState”来调用自己
这可能是处理它的最佳方式,因为它可以让您最大程度地控制状态和意图的名称
另一个选项是利用“NewSession”事件,假设您希望每个新会话都以相同的状态开始。此事件在启动请求之前触发,所有新会话都将通过它进行引导。您的代码看起来有点像这样:
NewSession () {
if(this.event.request.type === Events.LAUNCH_REQUEST) {
this.emit('LaunchRequest');
} else if (this.event.request.type === "IntentRequest") {
this.handler.state = states.START;
this.emitWithState(this.event.request.intent.name);
}
};
这里可以看到一个完整的示例(查看Handlers.js文件):
我还建议您阅读Alexa GitHub的本节:
编辑:
我再次查看了您提供的引用,看起来他们正在alexa处理程序之外设置状态。因此,假设您想要模拟他们正在做的事情,您不会在您的意图处理程序中设置状态,而是在Lambda处理程序本身(您在其中创建alexa对象)中设置状态
意图请求在调用之前是否经过启动请求
?因为即使我从一开始就做了一个IntentRequest
(例如,“Alexa,告诉我的应用我说了你好”而不是“Alexa,打开我的应用”),它仍然没有处于我希望技能开始的状态。不,因此只有当有人无意中调用你的技能(“Alexa,启动我的应用”)时才会触发启动请求。其他任何内容都将尝试调用用户请求的意图(假设“我说你好”映射到IntentA,“Alexa,告诉我的应用我说你好”将尝试在当前状态下调用“IntentA”)。好的,这就是我的想法(:所以我刚才看到了你的编辑,这对我不起作用(因此问题)在代码> > index >处理程序> /代码>中设置状态似乎无法正确地调整Alexa的“开始状态”。我在空白状态中定义了<代码>未处理的< /代码>和未定义“代码> iTuns>代码”。所有事件(意图请求/启动请求/等)在新会话发生时(基本上是在技能打开时)都会首先经历此过程。嗯,所以现在我的技能确实有效,但这需要有一个NewSession
事件,就像您在回答中建议的那样!顺便说一句,谢谢你-但我只是想如果我能让alexa.state=START\u MODE
工作,那将是一个很好的解决方案哈哈
exports.handler = function (event, context, callback) {
var alexa = Alexa.handler(event, context);
alexa.appId = appId;
alexa.registerHandlers(
handlers,
stateHandlers,
);
alexa.state = START_MODE;
alexa.execute();
};