ミドルウェアとは
Bot Framework において、クライアントから受信したメッセージはアダプターを介してボットに届けられますが、アダプターにミドルウェアを設定しておくことで、メッセージがボットに届く前に割り込んで処理を行うことができます。
Adapter → Middleware1 → Middleware2 → Middleware3 → ... → YourBot
ミドルウェアは上記のように複数登録することができ、登録された順に呼び出されていきます。
アダプターにミドルウェアを追加するには、BotFrameworkAdapter#use()
メソッドを使用します。
ミドルウェアを実装する
独自のミドルウェアを作成するには、Middleware インタフェース が提供する onTurn
メソッドを実装します。
ここでは、ユーザーの入力をコンソールに出力するだけの ConsoleLogger
というミドルウェアクラスを実装してみます。
とても簡単ですね。
あと、onTurn()
を抜ける前に忘れずに next()
を呼び出して、後続のミドルウェアが正しく呼び出されるようにしておく必要があります。
このミドルウェアをアダプターに登録するには次のようにします。
これで、ユーザーがチャットクライアント(チャンネル)から こんにちは
と入力すると、ボットサーバー側のコンソールに こんにちは
と出力されるようになります。
ちなみに、上記のミドルウェアを TypeScript で実装すると下記のような感じになります。
BotBuilder SDK 組み込まれているロギング用ミドルウェアを使用する
TranscriptLoggerMiddleware を使う
BotBuilder SDK の botbuilder
モジュールには、組み込みのロギング用ミドルウェアとして TranscriptLoggerMiddleware
が含まれています。
このミドルウェアをアダプターに登録するには次のようにします。
ここでは、出力先をコンソールにするために、パラメータとして ConsoleTranscriptLogger
オブジェクトを渡しています。
このようにミドルウェアを登録してからボットにアクセスすると、次のようなログがコンソールに出力されるようになります(Bot Framework Emulator から「こんにちは」と入力した場合の例です)。
ユーザーがチャンネルに送信したメッセージ(アクティビティ)と、ボットがチャンネルに送信したメッセージ(アクティビティ)は別々のログとして出力されることに注意してください。
Bot Framework において、「アクティビティ」はあくまで片道のメッセージを表す単位です。
独自の TranscriptLogger 実装
ちなみに、上記のサンプルコードで使用している ConsoleTranscriptLogger()
の実装は下記のようになっています (transcriptLogger.ts (L.162))。
logActivity()
メソッドを持つクラスを作ればよいだけなので、下記のように簡単に独自の TranscriptLogger
を実装できます。
ここでは、コンソールにログを出力していますが、必要に応じて Azure Storage や CosmosDB などに出力するとよいでしょう。
この MyLogger
は ConsoletranscriptLogger
とほぼ同様の内容ですが、Activity
オブジェクトの内容を JSON.stringify()
を使って全階層出力するようにしています。
応用: ミドルウェア側でセットした値をボット側で参照する
ミドルウェアの実装(onTurn()
内)で、TurnContext#turnState.set()
を使って何らかの値をセットしておくと、後続のボット本体の実装の中で、TurnContext#turnState.get()
でその値を参照できるようになります。
関連記事