在特定的状态下启动Alexa技能

早些时候,我遇到了Alexa的问题,没有把状态改回到空白状态,并发现有这样一个错误 。 为了完全避免这个问题,我决定,我想强制我的技能始终以START_MODE开头。

我用这个作为我的参考,他们通过在第55行的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-tools来testingMocha这个技能,当我直接提供IntentA就像这样:

 alexa.intended("IntentA", {}, function (err, p) { /*...*/ }) 

testing抱怨, Error: No 'Unhandled' function defined for event: Unhandled 。 从我所了解的情况来看,这只能意味着,在启动时,这个技能处于空白状态(因为我没有为这个状态定义任何Unhandled ),这意味着alexa.state并不是真的。 但那么这让我想知道他们是如何使它在上面的示例代码中工作的。

我想一个解决方法是为每个意图创build一个别名,我希望在START_MODE有这样的做法:

 IntentA () { this.handler.state = states.START; this.emitWithState("IntentA"); } 

但是我想知道是否有办法强制我的技能从一个特定的状态开始,因为这在我眼中看起来是一个更好的解决scheme。

问题是,当你得到一个LaunchRequest时,就没有你所发现的状态。 如果你看一下Alexa官方的例子,你会看到他们通过做你所说的来解决这个问题,为他们的所有意图做一个“别名”意图,并用它们来改变状态,然后使用“emitWithState”来调用自己。

这可能是处理这个问题的最好方法,因为它可以最大限度地控制状态和意图。

假设您希望每个新会话都以相同的状态启动,另一个select是利用“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

我也build议阅读这个部分的Alexa GitHub: https : //github.com/alexa/alexa-skills-kit-sdk-for-nodejs#making-skill-state-management-simpler

编辑:我再看看你提供的参考,它看起来像他们设置的状态以外的alexa处理程序。 所以,假设你想模仿他们正在做的事情,你不会在你的Intent处理器中设置状态,而是在Lambda处理器本身(你创buildalexa对象的地方)中设置状态。

 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(); };