ミドルウェアとは
このトピックを修了すると
ミドルウェアとは何かを説明でき、Expressにおけるリクエストの処理順序(パイプライン)を理解し、自分でミドルウェアを作成して適用できるようになります。
リクエストとレスポンスの間の「中間処理」
ウェブサーバーにリクエストが届くと、すぐにレスポンスを送信するわけではありません。その間にいくつかの段階を経ます。
リクエスト(Request) → [ロギング] → [認証確認] → [本文の解析] → ルートハンドラー → レスポンス(Response)この中間段階の一つ一つが**ミドルウェア(Middleware)**です。「リクエストが届いてレスポンスが送信されるまでの中間において、何らかの処理を行う関数」と定義できます。
Expressミドルウェアの構造
Expressでは、ミドルウェアは3つのパラメータを受け取る関数です。
function myMiddleware(req, res, next) {
// req: リクエストオブジェクト(クライアントから送信された情報)
// res: レスポンスオブジェクト(サーバーから送信する情報)
// next: 次のミドルウェアに処理を渡す関数
console.log(`${req.method} ${req.url}`);
next(); // これを呼び出さないと、リクエストがここで停止してしまう!
}
app.use(myMiddleware);next()が重要です。これを呼び出すことで、次のミドルウェア(またはルートハンドラー)に処理が渡ります。next()を呼び出すのを忘れると、クライアントはレスポンスを永久に待ち続けることになります。
実践的なミドルウェア — ロギング、認証、エラー
リクエストロギング
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認証確認
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番目の引数として渡すことで、選択的に適用することもできます。
エラー処理ミドルウェア
// パラメータは4つ — Expressがエラーハンドラーとして認識
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ error: 'サーバー内部エラー' });
});エラー処理ミドルウェアは、パラメータが4つです(errを追加)。Expressは、このシグネチャでエラーハンドラーを区別します。コードのどこからでもnext(err)を呼び出すと、ここに到達します。
実行順序がパイプライン
ミドルウェアは、app.use()で登録した順序で実行されます。順序を変えると、動作が変わります。
// 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.bodyがundefinedになります。ミドルウェアは、コードの位置が実行順序そのものです。
重要なまとめ
ミドルウェアは、大げさな概念ではありません。(req, res, next)関数を順序通りに連結したパイプラインです。ロギング、認証、解析、エラー処理 — ウェブサーバーで繰り返されるすべての「中間作業」がミドルウェアです。Expressだけでなく、ほとんどのウェブフレームワーク(Django、Rails、Spring)にも同じ概念があるので、一度理解すれば、どこでも適用できます。