[日本語Alexa] Alexa SDK for Node.js Ver2入門(その2)ハンドラの登録

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

本記事は、Alexa SDK for Node.js Ver2入門と題して、入門用という位置付けで、Alexa SDKの使い方を順に紹介しているものです。(対象は、Node.js用のみです。Java用には触れておりません)

今回(その2)は、ハンドラの登録について少し詳しく見ていきたいと思います。

ハンドラの登録は、下記の3種類があります。

  • addRequestHandlers (標準処理の追加)
  • addRequestInterceptors/addResponseInterceptors (前処理及び後処理の追加)
  • addErrorHandlers (エラー「例外」処理の追加)

以下、それぞれについてです。

2 addRequestHandlers(標準処理の追加)

addRequestHandlersで幾つでもハンドラを登録できることは、前回紹介させて頂きました。

skill = Alexa.SkillBuilders.custom()
        .addRequestHandlers(
            Handler1,
            Handler2,
            Handler3)
        .create();

前回は、詳しく触れませんでしたが、ここで登録するハンドラ関数は、下記のインターフェースに従う必要があります。

interface RequestHandler {
    canHandle(handlerInput: HandlerInput): Promise<boolean> | boolean;
    handle(handlerInput: HandlerInput): Promise<Response> | Response;
}

インターフェースは、2つの関数で構成されています。

canHandleは、次のhandleの前に、SDKによって呼び出され、ここでtrueを返したときのみ、handlerが実行されます。 HandlerInputオブジェクトからリクエストに関する全てが取得可能ですので、これを元にtrueを返すかfalseを返すかの判断を行うことが出来ます。

handleは、canHandleがtureを返した時のみSDKによって呼び出されます。 この関数は、ハンドラの要求処理ロジックを含みます。ここで返すResponseを使用して、スキルのレスポンスが組み立てられます。

下記の例は、LaunchRequestを処理するハンドラの例です。

const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
    },
    handle(handlerInput) {
        // LaunchRequestの処理
    }
};

3 addRequest(Response)Interceptors (前処理及び後処理の追加)

addRequestInterceptors及び、addResponseInterceptorsを使用すると、先に紹介した、addRequestHandlersで登録されたハンドラの前と後に、それぞれ実行するインターセプタが登録できます。

const skill = Alexa.SkillBuilders.custom()
            .addRequestHandlers(Handler1,
                                Handler2,
                                Handler3)
            .addRequestInterceptors(RequestInterceptor)
            .addResponseInterceptors(ResponseInterceptor)
            .create();

このインターセプタに登録できるハンドラのインターフェースは、下記のとおりです。

interface RequestInterceptor {
    process(handlerInput: HandlerInput): Promise<void> | void;
}

interface ResponseInterceptor {
    process(handlerInput: HandlerInput, response?: Response): Promise<void> | void;
}

どちらのインターセプタも、voidを返すprocess関数があります。前処理であるリクエストインターセプタはHandlerInputオブジェクトにアクセスできますが、後処理となるレスポンスインターセプタはHandlerInputRequestHandlerによって生成されたオプションのResponseにもアクセスできます。

下記の例では、前処理のインターセプタを登録して、AlexaからのリクエストのJSONをログに記録しています。

// ・・・省略・・・

skill = Alexa.SkillBuilders.custom()
    .addRequestHandlers(Handler)
    .addRequestInterceptors(RequestInterceptor)
    .create();

// ・・・省略・・・

const RequestInterceptor = {
    process(handlerInput) {
        console.log(JSON.stringify(handlerInput.requestEnvelope, null , "\t"))
    }
};

4 addErrorHandlers(エラー「例外」処理の追加)

addErrorHandlersを使用すると、処理中に例外が発生した場合の処理を記述することが出来ます。Promiseとして処理されている中で例外が発生した場合は、Rejectを返す前に、SDKは、このハンドラを呼び出します。

ここで指定できるハンドラのインターフェースは、以下のとおりです。

標準のハンドラと同様に、canHandlerが有りますので、ここで条件分岐することで、複数のエラーハンドラを定義することが出来ます。

interface ErrorHandler {
    canHandle(handlerInput: HandlerInput, error: Error): Promise<boolean> | boolean;
    handle(handlerInput: HandlerInput, error: Error): Promise<Response> | Response;
}

下記は、エラーハンドラを定義して、処理中に例外が発生してしまった場合に、スキルから「エラーが発生しました」と返事を返すようにしたものです。canHandlerは、trueを返していますので、全ての例外をキャッチできています。

// ・・・省略・・・

skill = Alexa.SkillBuilders.custom()
    .addRequestHandlers(Handler)
    .addErrorHandlers(ErrorHandler)
    .create();

// ・・・省略・・・

const ErrorHandler = {
    canHandle(handlerInput, error) {
        return true;
    },
    handle(handlerInput, error) {
        return handlerInput.responseBuilder
            .speak('エラーが発生しました')
            .getResponse();
    }
}

5 最後に

今回は、Alexa SDKでハンドラを登録する要領について紹介させて頂きました。

前回(その1)のサンプルでは、スキルに必須のハンドルであるAMAZON.HelpIntentStopIntentCancelIntentの処理や、エラー処理などは、まったく行っていませんでしたが、今回紹介したaddRequestHandlersaddErrorHandlersで、これを追加する事ができます。

9 参考リンク


Alexa Skills Kit SDK for Node.js
Now Available: Version 2 of the ASK Software Development Kit for Node.js
GitHub repository for the SDK v2 for Node.js
[日本語Alexa] Alexa SDK for Node.js Ver2入門(その1)はじめの一歩
[日本語Alexa] Alexa SDK for Node.js Ver2入門(その2)ハンドラの登録
[日本語Alexa] Alexa SDK for Node.js Ver2入門(その3)レスポンスの作成
[日本語Alexa] Alexa-SDK Ver2(その4)スキル属性
[日本語Alexa] Alexa-SDK Ver2(その5)ダイアログモード
[日本語Alexa] Alexa-SDK Ver2(その6) 所在地情報
[日本語Alexa] Alexa-SDK Ver2(その7) ディスプレイ表示