以特定状态启动Alexa技能

时间:2017-04-24 03:10:44

标签: javascript node.js alexa-skills-kit alexa-skill

早些时候我遇到了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");
}

但是我想知道是否有办法强迫我的技能从特定状态开始,因为在我看来这似乎是一个更好,更好的解决方案。

1 个答案:

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