Alexa Skill Lambda Node.js динамические намерения в обработчике - PullRequest
0 голосов
/ 18 сентября 2018

Возможно ли динамически заполнить намерения в лямбда-функции скила алекса?Например:

const handlers = {
var intentName = this.event.request.intent.name;
'LaunchRequest': function () {
    this.emit(':ask', welcomeOutput, welcomeReprompt);
},
'AMAZON.HelpIntent': function () {
    speechOutput = 'Placeholder response for AMAZON.HelpIntent.';
    reprompt = '';
    this.emit(':ask', speechOutput, reprompt);
},
'AMAZON.CancelIntent': function () {
    speechOutput = 'Placeholder response for AMAZON.CancelIntent';
    this.emit(':tell', speechOutput);
},
'AMAZON.StopIntent': function () {
    speechOutput = 'Placeholder response for AMAZON.StopIntent.';
    this.emit(':tell', speechOutput);
},
'SessionEndedRequest': function () {
    speechOutput = '';
    //this.emit(':saveState',true);//uncomment to save attributes to db on session end
    this.emit(':tell', speechOutput);
},
'ci_clothing': function () {
    speechOutput = '';

    speechOutput = "Here is the output";
    this.emit(":ask", speechOutput, speechOutput);
},}


exports.handler = (event, context) => {
   const alexa = Alexa.handler(event, context);
   alexa.appId = APP_ID;
   // To enable string internationalization (i18n) features, set a resources object.
   //alexa.resources = languageStrings;
   alexa.registerHandlers(handlers);
   //alexa.dynamoDBTableName = 'DYNAMODB_TABLE_NAME'; //uncomment this line to save attributes to DB
   alexa.execute();};

Например, если я хочу динамически иметь намерение 'ci_clothing'.Как бы я это сделал?

1 Ответ

0 голосов
/ 19 сентября 2018

Да, это возможно.Единственное, что вам нужно, это вспомогательная функция, которая создает все обработчики.Затем используйте эту вспомогательную функцию для registerHandlers.

Что-то вроде этого:

const getHandlers = (request) => {
    const intentName = request.intent.name;
    return {
        'LaunchRequest': function () {
            this.emit(':ask', welcomeOutput, welcomeReprompt);
        },
        'AMAZON.HelpIntent': function () {
            speechOutput = 'Placeholder response for AMAZON.HelpIntent.';
            reprompt = '';
            this.emit(':ask', speechOutput, reprompt);
        },
        'AMAZON.CancelIntent': function () {
            speechOutput = 'Placeholder response for AMAZON.CancelIntent';
            this.emit(':tell', speechOutput);
        },
        'AMAZON.StopIntent': function () {
            speechOutput = 'Placeholder response for AMAZON.StopIntent.';
            this.emit(':tell', speechOutput);
        },
        'SessionEndedRequest': function () {
            speechOutput = '';
            //this.emit(':saveState',true);//uncomment to save attributes to db on session end
            this.emit(':tell', speechOutput);
        },
        [intentName]: function () {
            speechOutput = '';

            speechOutput = "Here is the output";
            this.emit(":ask", speechOutput, speechOutput);
        },
    };
};

exports.handler = (event, context) => {
    const alexa = Alexa.handler(event, context);
    alexa.appId = APP_ID;
    alexa.registerHandlers(getHandlers(event.request));
    alexa.execute();
};

Отказ от ответственности : не проверено

Редактировать:

Но я думаю, что не рекомендуется переписывать все ваши обработчики.Вы должны определенно использовать встроенные намерения, а не свое намерение «управлять ими всеми».Соответственно, вы должны сделать небольшое изменение в getHandlers:

const getHandlers = (request) => {
    const intentName = request.intent.name;
    const handlers = {
        'LaunchRequest': function () {
            this.emit(':ask', welcomeOutput, welcomeReprompt);
        },
        'AMAZON.HelpIntent': function () {
            speechOutput = 'Placeholder response for AMAZON.HelpIntent.';
            reprompt = '';
            this.emit(':ask', speechOutput, reprompt);
        },
        'AMAZON.CancelIntent': function () {
            speechOutput = 'Placeholder response for AMAZON.CancelIntent';
            this.emit(':tell', speechOutput);
        },
        'AMAZON.StopIntent': function () {
            speechOutput = 'Placeholder response for AMAZON.StopIntent.';
            this.emit(':tell', speechOutput);
        },
        'SessionEndedRequest': function () {
            speechOutput = '';
            //this.emit(':saveState',true);//uncomment to save attributes to db on session end
            this.emit(':tell', speechOutput);
        },
    };

    if (!handlers[intentName]) {
        handlers[intentName] = function () {
            speechOutput = '';

            speechOutput = "Here is the output";
            this.emit(":ask", speechOutput, speechOutput);
        };
    }

    return handlers;
};
...