HTTP 概要

HTTPの概要

AdonisJSは主にHTTPリクエストに応答するアプリケーションを作成するためのウェブフレームワークです。このガイドでは、AdonisJSがHTTPサーバーを起動し、受信したリクエストを処理し、HTTPレイヤーで利用可能なモジュールについて学びます。

HTTPレイヤー

AdonisJSアプリケーション内のHTTPレイヤーは、以下のモジュールで構成されています。AdonisJSのHTTPレイヤーは、マイクロフレームワークを使用せずに独自に構築されています。

ルーター

ルーターモジュールは、アプリケーションのエンドポイントであるルートを定義する責任を持ちます。ルートは、リクエストを処理するためのハンドラーを定義する必要があります。ハンドラーはクロージャーまたはコントローラへの参照であることができます。

コントローラ

コントローラは、HTTPリクエストを処理するためにルートにバインドされるJavaScriptクラスです。コントローラは組織レイヤーとして機能し、アプリケーションのビジネスロジックを異なるファイル/クラスに分割するのに役立ちます。

HttpContext

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メソッドを使用してレスポンスボディを定義するか、ルートハンドラーから値を返すことで、レスポンスのシリアライズプロセスが開始され、適切なヘッダーが設定されます。

レスポンスボディのシリアライズについて詳しく見る