Умение Alexa забывает сессию между намерениями - PullRequest
0 голосов
/ 26 августа 2018

Я не уверен, что это потому, что я тестирую в консоли разработчика alexa, но похоже, что сессия перезапускается после каждого намерения.

В приведенном ниже коде, если я вызову SetMyVarA, он будетзапишите правильное значение в cloudwatch (или в терминал при использовании без сервера), но если я затем сразу вызову SetMyVarB, то получу «Хм, я не знаю этого» (локальный запуск просто даст мне undefined для значения).

Я также пытался следовать советам в этом вопросе, но, похоже, это не дало эффекта: добавление атрибутов сеанса навыка alexa из nodejs

/*jslint es6 */
"use strict";

const Alexa = require(`alexa-sdk`);

module.exports.handler = (event, context, callback) => {
    console.log(`handler: ${JSON.stringify(event.request)}`);
    const alexa = Alexa.handler(event, context, callback);
    alexa.appId = process.env.APP_ID;
    alexa.registerHandlers(handlers);
    alexa.execute();
};

const handlers = {
    "LaunchRequest": function() {
        console.log(`LaunchRequest`);
        this.emit(`AMAZON.HelpIntent`);
    },
    "SetMyVarA": function() {
        console.log(`Set MyVarA`);
        var myVarA = this.event.session.attributes.myVarA = this.event.request.intent.slots.myVarA.value;

        console.log(`MyVarA is ${myVarA}.`);
        var speechOutput = `MyVarA has been set to ` + myVarA + `.`;
        this.response.speak(speechOutput);
        this.emit(`:responseReady`);
    },
    "SetMyVarB": function() {
        console.log(`Set MyVarB`);
        var myVarB = this.event.session.attributes.myVarB = this.event.request.intent.slots.myVarB.value;
        console.log(`MyVarB is ${myVarB}.`);

        var myVarA = this.event.session.attributes.myVarA
        console.log(`MyVarA is ${myVarA}.`);

        var speechOutput = {
            "type": `SSML`,
            "ssml": `<speak>MyVarB is ` + myVarB + `.</speak>`,
        };
        this.response.speak(speechOutput);

        this.emit(`:responseReady`);
    },
    "AMAZON.HelpIntent": function() {
        var speechOutput = `This is a skill.`;
        var reprompt = `Help here.`;
        speechOutput = speechOutput + reprompt;
        this.response.speak(speechOutput)
            .listen(reprompt);
        this.emit(`:responseReady`);
    },
    "AMAZON.CancelIntent": function() {
    },
    "AMAZON.StopIntent": function() {
    },
    "AMAZON.RepeatIntent": function() {
        console.log(`RepeatIntent`);
        this.emit(`LaunchRequest`);
    },
    "Unhandled": function() {
        // handle any intent in interaction model with no handler code
        console.log(`Unhandled`);
        this.emit(`LaunchRequest`);
    },
    "SessionEndedRequest": function() {
        // "exit", timeout or error. Cannot send back a response
        console.log(`Session ended: ${this.event.request.reason}`);
    },
};

1 Ответ

0 голосов
/ 26 августа 2018

В SetMyVar, если вы используете speak(), а затем emit a responseReady, сессия закрывается по умолчанию, поэтому вы уже вышли из нее, когда пытаетесь вызвать свое второе намерение.

Если вы хотите сделать то же самое, что вы делаете в SetMyVarA, но не закрываете сеанс немедленно, вам нужно установить this.response.shouldEndSession на false.Консоль разработки Dev может без проблем справляться с сессиями навыков, так что не беспокойтесь об этом.

Кстати, вы используете ASK v1, который устарел.Пожалуйста, переключитесь на код v2 следующим образом:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...