この記事は公開されてから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オブジェクトにアクセスできますが、後処理となるレスポンスインターセプタは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) ディスプレイ表示