ホームページ > ウェブフロントエンド > jsチュートリアル > Express.js のミドルウェアとその内部動作について

Express.js のミドルウェアとその内部動作について

Patricia Arquette
リリース: 2024-12-22 21:21:12
オリジナル
704 人が閲覧しました

Understanding Middlewares in Express.js and Their Internal Working

Express.js では、ミドルウェアはリクエスト (req)、レスポンス (res)、および next と呼ばれる 3 番目のパラメーターにアクセスできる特別な関数です。通常のルート ハンドラーとは異なり、ミドルウェアは、メインのビジネス ロジックの前に外部ロジックを実行することで、アプリケーションのフローを制御する上で重要な役割を果たします。

ミドルウェアはどのように機能するのでしょうか?

HTTP リクエストが Express.js サーバーに到達すると、一連のミドルウェア関数を通過します。各ミドルウェアは次のことができます:

  • リクエスト オブジェクトを変更します (データの添付、トークンの検証など)。
  • 応答オブジェクトを変更します (例: 応答を早めに送信します)。
  • next() 関数を使用して、スタック内の次のミドルウェアに制御を渡します。

ミドルウェアが next() を呼び出さない場合、要求と応答のサイクルはそこで終了し、それ以降のロジック (ルート ハンドラーを含む) は実行されません。

なぜミドルウェアを使用するのでしょうか?

ミドルウェアは、リクエストを処理する前に再利用可能なロジックを追加する必要があるシナリオに最適です。例:

  • 認証: ユーザーがログインしているかどうかを確認します (例: JWT トークンの検証)。
  • 認可: ユーザーが特定のアクションを実行するために必要な権限を持っていることを確認します (例: 管理者はコンテンツを削除できます)。
  • リクエストの検証: 必要な入力がすべて提供されているかどうかを確認します。
  • ログとモニタリング: 分析またはデバッグのための受信リクエストの詳細を記録します。
  • エラー処理: エラーをグローバルにキャッチして意味のある応答を送信します。

ミドルウェアの定義と使用

ミドルウェア関数は次のようになります:

app.use((req, res, next) => {
    // Logic here
    next(); // Pass control to the next middleware or route handler
});

ログイン後にコピー
  • req (リクエスト): 受信 HTTP リクエストに関する情報 (ヘッダー、本文、パラメーターなど) が含まれます。
  • res (応答): データをクライアントに送り返すために使用されます。 next(): 制御を次のミドルウェアに渡す関数。

ミドルウェアのフロー: 実行順序

ミドルウェアの順序は重要です! Express は、定義された順序でミドルウェアを順次実行します。

ミドルウェアがルートの後に定義されている場合、そのルートには影響しません。このため、app.js でルートの前にミドルウェアを宣言する必要があります。

例:

// Middleware to check if the user has admin privileges
app.use((req, res, next) => {
    console.log("Checking for admin role...");

    // Simulating a user object attached earlier in the pipeline
    if (req.user && req.user.role === "admin") {
        console.log("Access granted");
        next(); // Move to the next middleware or route handler
    } else {
        console.log("Access denied");
        res.status(403).send("You do not have access to this resource.");
    }
});

// Routes
app.get("/admin/dashboard", (req, res) => {
    res.send("Welcome to the admin dashboard!");
});

app.get("/public", (req, res) => {
    res.send("This is a public page.");
});

ログイン後にコピー

内部実行フロー

段階的に何が起こるかは次のとおりです:

  • 受信リクエスト: リクエストがサーバーにヒットします。
  • ミドルウェアの実行:
    • ミドルウェアは req.user.role をチェックします。
    • ロールが「admin」の場合、next() を呼び出して次のミドルウェアまたはルートに制御を渡します。
    • そうでない場合、ミドルウェアは 403 Forbidden 応答を送信してリクエストを終了します。
  • ルート ハンドラー: next() が呼び出されると、関連するルート ハンドラー (/admin/dashboard など) が実行されます。

フローの例:

  • ロール「admin」を持つユーザーが /admin/dashboard をリクエストします。
    • ミドルウェアは「アクセス許可」をログに記録し、next() を呼び出します。
    • ルート ハンドラーは「管理ダッシュボードへようこそ!」を送信します。
  • ロール「user」を持つユーザーが /admin/dashboard をリクエストします。
    • ミドルウェアは「アクセスが拒否されました」をログに記録し、「このリソースへのアクセス権がありません」を送信します。

重要なポイント

  • ミドルウェアは門番のようなもので、メイン ルート ロジックが実行される前に何が起こるかを決定します。
  • next() を使用して、フローが次のミドルウェアまたはルートに確実に進むようにします。
  • 必ずルートの前に重要なミドルウェアを定義して、確実に適用してください。
  • next() を呼び出すか、応答を送信しないと、リクエストはハング (タイムアウト) します。

以上がExpress.js のミドルウェアとその内部動作についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート