[日本語Alexa] Alexa SDK for Node.js Ver2入門(その2)ハンドラの登録
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オブジェクトにアクセスできますが、後処理となるレスポンスインターセプタはHandlerInputとRequestHandlerによって生成されたオプションの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.HelpIntent、StopIntent、CancelIntentの処理や、エラー処理などは、まったく行っていませんでしたが、今回紹介したaddRequestHandlersとaddErrorHandlersで、これを追加する事ができます。
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) ディスプレイ表示