一覧へ

「ミドルウェアとは何か」

「Expressミドルウェアとは何か、リクエストがサーバーを通過する過程をパイプラインとして理解します。」

中級
|
8
|
検証済み (2026-07)
ミドルウェアExpressリクエストパイプラインnext関数ロギング
進捗0/55 (0%)

ミドルウェアとは

このトピックを修了すると

ミドルウェアとは何かを説明でき、Expressにおけるリクエストの処理順序(パイプライン)を理解し、自分でミドルウェアを作成して適用できるようになります。


リクエストとレスポンスの間の「中間処理」

ウェブサーバーにリクエストが届くと、すぐにレスポンスを送信するわけではありません。その間にいくつかの段階を経ます。

text
リクエスト(Request) → [ロギング] → [認証確認] → [本文の解析] → ルートハンドラー → レスポンス(Response)

この中間段階の一つ一つが**ミドルウェア(Middleware)**です。「リクエストが届いてレスポンスが送信されるまでの中間において、何らかの処理を行う関数」と定義できます。


Expressミドルウェアの構造

Expressでは、ミドルウェアは3つのパラメータを受け取る関数です。

javascript
function myMiddleware(req, res, next) {
  // req: リクエストオブジェクト(クライアントから送信された情報)
  // res: レスポンスオブジェクト(サーバーから送信する情報)
  // next: 次のミドルウェアに処理を渡す関数

  console.log(`${req.method} ${req.url}`);
  next(); // これを呼び出さないと、リクエストがここで停止してしまう!
}

app.use(myMiddleware);

next()が重要です。これを呼び出すことで、次のミドルウェア(またはルートハンドラー)に処理が渡ります。next()を呼び出すのを忘れると、クライアントはレスポンスを永久に待ち続けることになります。


実践的なミドルウェア — ロギング、認証、エラー

リクエストロギング

javascript
app.use((req, res, next) => {
  const now = new Date().toISOString();
  console.log(`[${now}] ${req.method} ${req.url}`);
  next();
});
// [2026-07-03T10:30:00.000Z] GET /users

認証確認

javascript
function authGuard(req, res, next) {
  const token = req.headers.authorization;
  if (!token) {
    return res.status(401).json({ error: 'ログインが必要です' });
  }
  next(); // トークンがあれば、次の処理へ
}

// 特定のルートにのみ適用
app.get('/my-profile', authGuard, (req, res) => {
  res.json({ name: 'キム・フン' });
});

app.use()で、すべてのリクエストに適用することもできますし、特定のルートの2番目の引数として渡すことで、選択的に適用することもできます。

エラー処理ミドルウェア

javascript
// パラメータは4つ — Expressがエラーハンドラーとして認識
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: 'サーバー内部エラー' });
});

エラー処理ミドルウェアは、パラメータが4つです(errを追加)。Expressは、このシグネチャでエラーハンドラーを区別します。コードのどこからでもnext(err)を呼び出すと、ここに到達します。


実行順序がパイプライン

ミドルウェアは、app.use()で登録した順序で実行されます。順序を変えると、動作が変わります。

javascript
// 1. 本文の解析(最初に行う!)
app.use(express.json());

// 2. ロギング
app.use((req, res, next) => {
  console.log(`${req.method} ${req.url}`, req.body);
  next();
});

// 3. ルート
app.post('/users', (req, res) => {
  res.json(req.body);
});

// 4. エラー処理(常に最後)
app.use((err, req, res, next) => {
  res.status(500).json({ error: err.message });
});

express.json()をロギングよりも前に配置することで、req.bodyに解析されたデータが入ります。順序を入れ替えると、req.bodyundefinedになります。ミドルウェアは、コードの位置が実行順序そのものです。


重要なまとめ

ミドルウェアは、大げさな概念ではありません。(req, res, next)関数を順序通りに連結したパイプラインです。ロギング、認証、解析、エラー処理 — ウェブサーバーで繰り返されるすべての「中間作業」がミドルウェアです。Expressだけでなく、ほとんどのウェブフレームワーク(Django、Rails、Spring)にも同じ概念があるので、一度理解すれば、どこでも適用できます。


💬 質問・コメント

0件のコメント

ログインせずに投稿できます。ゲスト投稿は投稿者自身で編集・削除できません。

0/2000

読み込み中...