Alexa Request Interceptor - Не могу убить сеанс - PullRequest
0 голосов
/ 18 ноября 2018

Можно ли сделать так, чтобы RequestInterceptor прерывал сеанс на основе некоторой логики внутри RequestInterceptor?

У меня есть закодированная процедура, которая проверяет достоверность пользователя.Если проверка достоверности завершается неудачно, я хочу воспроизвести сообщение для пользователя и прервать сеанс.

Я вижу, что происходит то, что LaunchRequest все еще выполняется, хотя я пытаюсь убить сеанс в RequestInterceptor

Упрощенная версия выглядит следующим образом:

const Alexa = require('ask-sdk-core');

const requestInterceptor = {
  var isUserOk = false;

  if(!isUserOk){
    process(handlerInput) {
     return handlerInput.responseBuilder
      .speak("You are inside the Request Interceptor")
      .withShouldEndSession(true)
      .getResponse();
    }
  }
}

const launchRequestHandler = {
  canHandle(handlerInput) {
    return (handlerInput.requestEnvelope.session.new && 
            handlerInput.requestEnvelope.request.type === 'LaunchRequest');
},
handle(handlerInput) {
  return handlerInput.responseBuilder
    .speak("Hi, welcome to the test skill. What is your name?")
    .reprompt("You did not respond. Please tell me your name")
    .getResponse();
  }
};

const skillBuilder = Alexa.SkillBuilders.custom();

exports.handler = skillBuilder
         .addRequestHandlers(
                  launchRequestHandler,
         )
        .addRequestInterceptors(
                 requestInterceptor
         )
        .lambda();

Может кто-нибудь сказать мне, возможно ли, чтобы логика в RequestInterceptor прервала сеанс и запретила запуск обработчика LaunchRequest?

Спасибо

-bc

1 Ответ

0 голосов
/ 18 ноября 2018

Это не работает, потому что перехватчики не возвращают ответы (обратите внимание, что метод перехватчика называется process(), а не handle()). В перехватчике вместо попытки закрыть сеанс используйте handlerInput для установки атрибут сеанса с именем, например, validUser

let attributes = handlerInput.attributesManager.getSessionAttributes();
attributes.validUser = isUserOk(); //call your user check function here
handlerInput.attributesManager.setSessionAttributes(attributes);

Теперь создайте launchRequestBadUserHandler, где в canHandle() требуется, чтобы атрибут сеанса был равен false:

const attributes = handlerInput.attributesManager.getSessionAttributes();
const isUserOk = attributes.validUser;
canHandle(handlerInput) {
        return (handlerInput.requestEnvelope.session.new && 
                handlerInput.requestEnvelope.request.type === 'LaunchRequest' &&
                !isUserOk);

В этом обработчике handle() функция отправляет ответ, который вы изначально запланировали для перехватчика. Не забудьте вызвать этот обработчик до вашего исходного обработчика запросов запуска в addRequestHandlers()

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