序章

ミドルウェアは、Expressサーバーに対してライフサイクル方式を実行し、requestおよびresponseサイクルを利用する機能です。 Express.jsは組み込みのミドルウェアを提供し、ユーザーが特定の操作を実行できないようにしたり、アプリケーションへの着信要求のパスをログに記録したりするなど、正確な機能のためのカスタムバージョンを作成できます。

この記事では、Express.jsでカスタムミドルウェアを作成する方法について学習します。

前提条件

この記事をフォローするには、次のものが必要です。

  • Node.jsの一般的な理解が推奨されますが、必須ではありません。 Node.jsの詳細については、Node.jsシリーズのコーディング方法をご覧ください。
  • requestおよびresponseサイクルの一般的な理解。 Expressでreqオブジェクトを使用する方法とExpressでresオブジェクトを使用する方法に関するチュートリアルを確認してください。
  • Node.jsはローカルにインストールされます。これは、Node.jsのインストール方法とローカル開発環境の作成に従って実行できます。

Expressミドルウェアの分析

Express.jsのすべてのミドルウェア関数は、requestresponse、およびnextライフサイクルメソッドに続く3つの引数を受け入れます。 index.jsファイルで、次の3つのライフサイクルメソッドを引数として関数を定義します。

index.js
function myCustomMiddleware(req, res, next) {
  // ...
}

最初の引数reqは、クライアント側からデータにアクセスしてHTTPリクエストを容易にするためのプロパティが組み込まれたrequestオブジェクトの省略形です。 res引数は、HTTPリクエストを介してクライアント側にデータを送信するための組み込みメソッドを備えたresponseオブジェクトです。 引数nextは、アプリケーション用に構成した次のミドルウェアに進むようにExpress.jsに指示する関数です。

ミドルウェアには、reqおよびresオブジェクトを変更し、任意のコードを実行し、requestおよびresponseサイクルを終了して、次の手順に進むことができます。関数。

next()関数を呼び出す必要があるため、ミドルウェアの順序に注意してください。

ミドルウェアを構築する3つの引数を確認したので、カスタムミドルウェアを組み立てる方法を見てみましょう。

reqオブジェクトの使用

現在ログインしているユーザーを識別するために、認証手順を通じてユーザーをフェッチできるカスタムミドルウェアを構築できます。 setCurrentUser.jsファイルで、3つのライフサイクルメソッドを引数として受け入れる関数を定義します。

ミドルウェア/setCurrentUser.js
// Require in logic from your authentication controller
const getUserFromToken = require("../getUserFromToken");

module.exports = function setCurrentUser(req, res, next) {
  const token = req.header("authorization");

  // look up the user based on the token
  const user = getUserFromToken(token).then(user => {
    // append the user object the the request object
    req.user = user;

    // call next middleware in the stack
    next();
  });
};

setCurrentUser()関数内で、reqオブジェクトは、組み込みの.header()メソッドを適用して、ユーザーからアクセストークンを返します。 認証コントローラーメソッドgetUserFromToken()を使用すると、req.header()ロジックが引数として渡され、トークンに基づいてユーザーを検索します。 reqオブジェクトを使用してカスタムプロパティを定義し、.userを使用してユーザーの情報を保存することもできます。 ミドルウェアが完成したら、ファイルをエクスポートします。

組み込みのExpress.jsミドルウェア.use()を適用することにより、Expressサーバーでカスタムミドルウェアを有効にできます。

server.jsファイルで、Expressのインスタンスをインスタンス化し、setCurrentUser()カスタムミドルウェアで要求します。

server.js
const express = require('express');

const setCurrentUser = require('./middleware/setCurrentUser.js');

const app = express();

app.use(setCurrentUser);

// ...

app.use()ミドルウェアは、カスタムミドルウェアを引数として受け入れ、Expressサーバーでロジックを承認します。

resオブジェクトの適用

新しいヘッダーの設計など、responseオブジェクトの機能を処理するカスタムミドルウェアを作成することもできます。

addNewHeader.jsファイルで関数を定義し、resオブジェクトで.setHeader()メソッドを使用します。

ミドルウェア/addNewHeader.js
module.exports = function addNewHeader(req, res, next) {
  res.setHeader("X-New-Policy", "Success");
  next();
};

ここで、.setHeader()メソッドは、各関数呼び出しに新しいヘッダーSuccessを適用します。 next()メソッドは、実行が完了すると、Express.jsに次のミドルウェアに進むように指示します。

RequestおよびResponseサイクルの終了

Express.jsを使用すると、カスタムミドルウェアのrequestおよびresponseサイクルを終了することもできます。 カスタムミドルウェアの一般的な使用例は、reqオブジェクトでユーザーのデータセットを検証することです。

isLoggedIn.jsファイルで、関数を定義し、ユーザーのデータがreqオブジェクトに存在するかどうかを確認する条件を設定します。

ミドルウェア/isLoggedIn.js
module.exports = function isLoggedIn(req, res, next) {
  if (req.user) {
    next();
  } else {
    // return unauthorized
    res.send(401, "Unauthorized");
  }
};

ユーザーのデータがreqオブジェクトに存在する場合、カスタムミドルウェアは次の機能に進みます。 特定のユーザーのデータがオブジェクトにない場合、resオブジェクトの.send()メソッドは、エラーステータスコード401とメッセージをクライアント側に転送します。

ミドルウェアを設定したら、ファイルをエクスポートしてExpress.jsサーバーに移動します。 server.jsファイルで、カスタムミドルウェアをGETリクエストの引数として要求し、挿入して、単一のルートでユーザーを認証します。

server.js
const express = require("express");

const setCurrentUser = require("./middleware/setCurrentUser.js");
const isLoggedIn = require("./middleware/isLoggedIn.js");

const app = express();

app.use(setCurrentUser);

app.get("/users", isLoggedIn, function(req, res) {
  // ...
});

ルート/usersは、isLoggedInカスタムミドルウェア内のロジックを処理します。 Expressサーバーの順序に基づいて、ルートはGETリクエストの前に定義されているsetCurrentUserミドルウェアにもアクセスできます。

結論

Express.jsは、組み込みメソッドの外部でミドルウェアをカスタマイズして、ユーザー認証とそのデータを解析する機能を提供します。

カスタムExpress.jsミドルウェアの作成に関する詳細については、Express.jsサイトの公式ドキュメントにアクセスしてください。