早些时候我遇到了Alexa没有将状态改回空白状态的问题,found out that there is a bug in doing that。为了完全避免这个问题,我决定强迫我的技能始终以START_MODE
开头。
我使用this作为参考,他们在第55行alexa.state = constants.states.START
之前alexa.execute()
设置技能状态。但是,当我在代码中执行相同操作时,它不起作用。
以下是我目前的技能:
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-tools
使用Mocha
来测试此技能,当我直接向IntentA
提供这样的技能时:
alexa.intended("IntentA", {}, function (err, p) { /*...*/ })
测试抱怨,Error: No 'Unhandled' function defined for event: Unhandled
。从我收集的内容来看,这只能意味着启动时的技能处于空白状态(因为我没有为该状态定义任何Unhandled
),这必然意味着alexa.state
不是真的很棒。但后来这让我想知道他们是如何在上面的示例代码中使它工作的。
我想解决这个问题的方法是为{em>我想要在START_MODE
创建的每个意图创建一个别名,方法是:
IntentA () {
this.handler.state = states.START;
this.emitWithState("IntentA");
}
但是我想知道是否有办法强迫我的技能从特定状态开始,因为在我看来这似乎是一个更好,更好的解决方案。
答案 0 :(得分:1)
问题在于,当您获得LaunchRequest时,没有状态,正如您所发现的那样。如果你看一下官方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文件):https://github.com/alexa/skill-sample-node-device-address-api/tree/master/src
我还建议您阅读Alexa GitHub上的这一部分:https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs#making-skill-state-management-simpler
修改强> 我再看一下你提供的引用,看起来他们正在设置alexa处理程序之外的状态。因此,假设您想模仿他们正在做的事情,您不会在Intent处理程序中设置状态,而是在Lambda处理程序本身(您创建alexa对象的位置)中设置状态。
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();
};