Javascript 在特定状态下启动Alexa技能 早些时候,我遇到了Alexa不把状态变回空白状态的问题。为了完全避免这个问题,我决定强制我的技能总是从START\u模式开始

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

我将其用作参考,他们通过在第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工具
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();
};