【问题标题】:Starting Alexa Skill in a specific state在特定状态下启动 Alexa Skill
【发布时间】:2017-04-24 03:10:43
【问题描述】:

早些时候我遇到了 Alexa 没有将状态更改回空白状态的问题,以及 found out that there is a bug in doing that。为了完全避免这个问题,我决定强制我的技能始终以 START_MODE 开头。

我使用 this 作为我的参考,他们通过在第 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-toolsMocha 测试这个技能,当我像这样直接喂IntentA 时:

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

测试抱怨,Error: No 'Unhandled' function defined for event: Unhandled。据我所知,这只能意味着该技能在启动时处于空白状态(因为我没有为该状态定义任何Unhandled),这一定意味着alexa.state 不是一个真正的东西。但这让我想知道他们是如何让它在上面的示例代码中工作的。

我想解决这个问题的方法是为我希望在START_MODE 中拥有的每个意图创建一个别名,方法是:

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

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

【问题讨论】:

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


    【解决方案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();
    };
    

    【讨论】:

    • intent 请求在被调用之前是否经过LaunchRequest?因为即使我从一开始就创建了IntentRequest(例如“Alexa,告诉 MyApp 我打了招呼”而不是“Alexa,打开 MyApp”),仍然找不到我想要技能开始的状态。
    • 否,因此仅当有人无意识地调用您的技能时才会触发 LaunchRequest(“Alexa,launch MyApp”)。其他任何事情都会尝试调用用户请求的意图(假设“我说嗨”映射到 IntentA,“Alexa,告诉 MyApp 我说嗨”将尝试在当前状态下调用“IntentA”。)。跨度>
    • 好的,这就是我的想法(:所以我刚刚看到你的编辑,这对我不起作用(因此问题)..在index.handler 中设置状态似乎没有正确调整Alexa 的“起始状态”。我已经通过在空白状态下定义 Unhandled 而非定义 IntentA 来确认这一点。
    • 哦,好吧,我想你问的原因是有道理的 :) 你是否尝试通过 NewSession 事件设置状态?所有事件(意图请求/启动请求/等)在新会话发生时(基本上,每当技能打开时)都会首先经过。
    • mmhm,所以现在我的技能确实有效,但这涉及到 NewSession 事件,就像你在回答中建议的那样!顺便说一句,谢谢你 - 但我只是想如果我能让alexa.state = START_MODE 工作,那将是一个很好的解决方案哈哈
    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多