HTTPの概要
AdonisJSは主にHTTPリクエストに応答するアプリケーションを作成するためのウェブフレームワークです。このガイドでは、AdonisJSがHTTPサーバーを起動し、受信したリクエストを処理し、HTTPレイヤーで利用可能なモジュールについて学びます。
HTTPレイヤー
AdonisJSアプリケーション内のHTTPレイヤーは、以下のモジュールで構成されています。AdonisJSのHTTPレイヤーは、マイクロフレームワークを使用せずに独自に構築されています。
-
ルーターモジュールは、アプリケーションのエンドポイントであるルートを定義する責任を持ちます。ルートは、リクエストを処理するためのハンドラーを定義する必要があります。ハンドラーはクロージャーまたはコントローラへの参照であることができます。
-
コントローラは、HTTPリクエストを処理するためにルートにバインドされるJavaScriptクラスです。コントローラは組織レイヤーとして機能し、アプリケーションのビジネスロジックを異なるファイル/クラスに分割するのに役立ちます。
-
AdonisJSは、受信したHTTPリクエストごとにHttpContextクラスのインスタンスを作成します。HttpContext(または
ctx
)は、リクエストのリクエストボディ、ヘッダー、認証されたユーザーなどの情報を保持します。 -
AdonisJSのミドルウェアパイプラインは、Chain of Responsibilityデザインパターンの実装です。ミドルウェアを使用して、ルートハンドラーに到達する前にHTTPリクエストをインターセプトして応答できます。
-
グローバル例外ハンドラーは、HTTPリクエスト中に発生した例外を中央の場所で処理します。グローバル例外ハンドラーを使用して例外をHTTPレスポンスに変換したり、外部のログサービスに報告したりできます。
-
サーバー
-
サーバーモジュールは、ルーター、ミドルウェア、グローバル例外ハンドラーを結び付け、リクエストを処理するためにNode.jsのHTTPサーバーにバインドするためのハンドル関数をエクスポートします。
AdonisJSがHTTPサーバーを起動する方法
HTTPサーバーは、Serverクラスのboot
メソッドを呼び出すと起動されます。このメソッドは、以下のアクションを実行します。
- ミドルウェアパイプラインの作成
- ルートのコンパイル
- グローバル例外ハンドラーのインポートとインスタンス化
通常のAdonisJSアプリケーションでは、boot
メソッドはbin/server.ts
ファイル内のIgnitorモジュールによって呼び出されます。
また、boot
メソッドが呼び出される前に、ルート、ミドルウェア、およびグローバル例外ハンドラーを定義することが重要です。AdonisJSは、start/routes.ts
およびstart/kernel.ts
のプリロードファイルを使用してこれを実現しています。
HTTPリクエストのライフサイクル
受信したHTTPリクエストを処理するためにHTTPサーバーがリスニングしていることがわかりました。次に、AdonisJSが与えられたHTTPリクエストをどのように処理するかを見てみましょう。
- HttpContextの作成
-
最初のステップとして、サーバーモジュールはHttpContextクラスのインスタンスを作成し、ミドルウェア、ルートハンドラー、およびグローバル例外ハンドラーに参照として渡します。
AsyncLocalStorageを有効にしている場合、同じインスタンスがローカルストレージ状態として共有されます。
- サーバーミドルウェアスタックの実行
-
次に、サーバーミドルウェアスタックからミドルウェアが実行されます。これらのミドルウェアは、ルートハンドラーに到達する前にリクエストをインターセプトして応答できます。
また、HTTPリクエストは、与えられたエンドポイントに対してルーターが定義されていない場合でも、サーバーミドルウェアスタックを通過します。これにより、サーバーミドルウェアはルーティングシステムに依存せずにアプリに機能を追加できます。
- 一致するルートの検索
-
サーバーミドルウェアがリクエストを終了しない場合、
req.url
プロパティに一致するルートを検索します。一致するルートが存在しない場合、リクエストは404 - Not found
の例外で中断されます。それ以外の場合は、リクエストを続行します。 - ルートミドルウェアの実行
-
一致するルートがある場合、ルーターグローバルミドルウェアと名前付きミドルウェアスタックを実行します。再度、ミドルウェアはルートハンドラーに到達する前にリクエストをインターセプトできます。
- ルートハンドラーの実行
-
最後のステップとして、リクエストはルートハンドラーに到達し、レスポンスとともにクライアントに返されます。
プロセスのいずれかのステップで例外が発生した場合、リクエストはグローバル例外ハンドラーに渡され、例外をレスポンスに変換する責任を持ちます。
- レスポンスのシリアライズ
-
response.send
メソッドを使用してレスポンスボディを定義するか、ルートハンドラーから値を返すことで、レスポンスのシリアライズプロセスが開始され、適切なヘッダーが設定されます。