Как использовать addErrorHandlers в Alexa ASK SDK V2 - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь обновить свой навык с V1 до ASK SDK V2.У меня проблемы с использованием функции addErrorHandlers на StandardSkillBuilder.Когда я генерирую ошибку в своем намерении, мой пользовательский обработчик ошибок никогда не вызывается.Я не уверен, как его использовать.

index.ts

import { SkillBuilders } from 'ask-sdk';
import { LambdaHandler } from 'ask-sdk-core/dist/skill/factory/BaseSkillFactory';

// import intents
import LaunchIntent from './alexa-intents/launch.intent';
import CustomErrorHandler from './alexa-intents/custom-error-handler';

function buildAlexaLambdaHandler(): LambdaHandler {
    return SkillBuilders.standard()
        .addRequestHandlers(
            new LaunchIntent()
        )
        .addErrorHandlers(new CustomErrorHandler())
        .lambda();
}

export const handler = buildAlexaLambdaHandler();

launch.intent.ts (выдать ошибку теста)

import { HandlerInput, RequestHandler } from 'ask-sdk';
import { Response } from 'ask-sdk-model'

export default class LaunchIntent implements RequestHandler {
    canHandle(handlerInput: HandlerInput): boolean {
        const request = handlerInput.requestEnvelope.request;
        return request.type === 'LaunchRequest';
    }

    handle(handlerInput: HandlerInput): Response {
        const responseBuilder = handlerInput.responseBuilder;
        const deviceId = handlerInput.requestEnvelope.context.System.device.deviceId;
        if (deviceId) {
            console.log('throwing error');
            throw new Error('test error');
        }
        return responseBuilder
            .speak('welcome')
            .getResponse();
    }
}

custom-error-handler.ts (попытка отловить ошибку теста)

import { HandlerInput, ErrorHandler } from 'ask-sdk';
import { Response } from 'ask-sdk-model';

export default class CustomErrorHandler implements ErrorHandler {

    canHandle(handlerInput: HandlerInput): boolean {
        return true;
    }

    handle(handlerInput: HandlerInput, error: Error): Response {
        const request = handlerInput.requestEnvelope.request;
        const deviceId = handlerInput.context.System.device.deviceId;
        console.dir(error);

        return handlerInput.responseBuilder
            .speak('there was an error')
            .getResponse();
    }
}

Я запускаю свой навык локально, используя bespoken-tools LambdaServer:

import * as bst from 'bespoken-tools';

const server = new bst.LambdaServer('./src/index', 10000, true);
server.start(() => console.log('[init.dev]: server started and listening on port 10000!'));

В моих журналах консоли я вижу свое консольное сообщение от обработчика намерений запуска «ошибка выброса», но затем я никогда не вижу вызываемый CustomErrorHandler или какие-либо журналы консоли от него,В симуляторе Alexa Developer Console я получаю «Возникла проблема с ответом на запрошенный навык», потому что CustomerErrorHandler.

ответ не был добавлен.

1 Ответ

0 голосов
/ 05 февраля 2019

Кто-то на форумах Alexa помог мне найти мою проблему.

По сути, мой CustomErrorHandler неправильно обращался к deviceId и сам выдавал ошибку.После изменения строки в CustomErrorHandler на эту проблему проблема была решена, и обработчик ошибок работал как положено.

const deviceId = handlerInput.requestEnvelope.context.System.device.deviceId;

вместо

const deviceId = handlerInput.context.System.device.deviceId;

Что-то еще, что могло бы быть хорошоПрактика заключается в том, чтобы иметь обработчик ошибок резервного копирования, чтобы перехватывать ошибки в ваших обработчиках ошибок, которые просто распечатывают ошибку, чтобы избежать ошибок в обработчике резервного копирования.

...