Express.jsにおけるミドルウェアとapp.useの詳細解説

2024-07-27

Express.jsは、Node.js用の軽量で柔軟なWebフレームワークです。その中核となるのがミドルウェアと呼ばれる機能です。ミドルウェアは、リクエストとレスポンスの処理フローに介入し、様々な処理を挿入できる仕組みです。

本記事では、ミドルウェアとapp.use関数の詳細について、分かりやすく解説します。

ミドルウェアとは

ミドルウェアは、リクエストとレスポンスの処理フローに介入し、様々な処理を挿入できる関数です。具体的には、以下のようなことができます。

  • 認証・認可: ユーザーの認証や認可を行い、アクセス権限を制御する
  • ロギング: リクエストとレスポンスに関する情報を記録する
  • データの変換: リクエストやレスポンスのデータ形式を変換する
  • キャッシュ: 静的コンテンツをキャッシュしてパフォーマンスを向上させる
  • エラー処理: エラーが発生した際の処理をハンドリングする

ミドルウェアは、単独で動作することも、複数を組み合わせることもできます。また、組み込みのミドルウェアに加え、サードパーティ製のミドルウェアも豊富に用意されています。

app.use関数

app.use関数は、ミドルウェアをExpressアプリケーションに登録するために使用されます。引数として、ミドルウェア関数とオプションのパスを渡します。パスを指定した場合、そのパスに一致するリクエストのみでミドルウェアが実行されます。

app.use(middlewareFunction); // すべてのパスでミドルウェアを実行
app.use('/users', middlewareFunction); // '/users' パスに一致するリクエストのみでミドルウェアを実行

ミドルウェアの処理フロー

ミドルウェアは、リクエストとレスポンスオブジェクトを引数として受け取り、処理を行います。処理が完了したら、next関数を呼び出す必要があります。next関数を呼び出すことで、次のミドルウェアまたはルーティングハンドラに処理を移行します。

app.use((req, res, next) => {
  // 処理
  next();
});

ミドルウェアの種類

ミドルウェアは、様々な種類に分類できます。代表的な種類は以下の通りです。

  • アプリケーションレベルミドルウェア: アプリケーション全体に適用されるミドルウェア
  • ルーターレベルミドルウェア: 特定のパスにのみ適用されるミドルウェア
  • 組み込みミドルウェア: Expressに標準で用意されているミドルウェア
  • サードパーティ製ミドルウェア: 開発者が作成したミドルウェア

ミドルウェアは、Express.jsにおける重要な機能であり、様々な処理を柔軟に挿入することができます。app.use関数を使用してミドルウェアを登録し、アプリケーションの機能を拡張することができます。




app.use((req, res, next) => {
  const authToken = req.headers['Authorization'];
  if (!authToken) {
    return res.status(401).send('Unauthorized');
  }

  // トークンを検証する処理

  next();
});

ロギングミドルウェア

以下のコードは、ロギングミドルウェアの例です。このミドルウェアは、リクエストとレスポンスに関する情報をコンソールに出力します。

app.use((req, res, next) => {
  const method = req.method;
  const url = req.url;
  const startTime = Date.now();

  console.log(`${method} ${url} started`);

  res.on('finish', () => {
    const endTime = Date.now();
    const duration = endTime - startTime;
    console.log(`${method} ${url} finished in ${duration}ms`);
  });

  next();
});

データ変換ミドルウェア

以下のコードは、データ変換ミドルウェアの例です。このミドルウェアは、リクエストボディをJSON形式からオブジェクト形式に変換します。

app.use(express.json()); // JSONボディを自動的に解析するミドルウェアを登録

app.use((req, res, next) => {
  req.body = JSON.parse(req.body);
  next();
});

キャッシュミドルウェア

以下のコードは、キャッシュミドルウェアの例です。このミドルウェアは、静的コンテンツをキャッシュしてパフォーマンスを向上させます。

app.use(express.static('public', {
  maxAge: 600000 // キャッシュ期間を10分 (600000ミリ秒) に設定
}));

エラー処理ミドルウェア

以下のコードは、エラー処理ミドルウェアの例です。このミドルウェアは、エラーが発生した際に適切なエラーメッセージを返します。

app.use((err, req, res, next) => {
  console.error(err.stack);

  res.status(500).send('Internal Server Error');
});



Express.jsにおけるミドルウェアの活用方法

カスタムミドルウェアの作成

組み込みのミドルウェアに加え、独自のミドルウェアを作成することもできます。これは、特定のニーズに合わせた処理を実行したい場合に役立ちます。

カスタムミドルウェアを作成するには、以下の手順に従います。

  1. ミドルウェア関数を定義します。この関数は、reqresnextの3つの引数を受け取ります。
  2. reqres オブジェクトを使用して、リクエストとレスポンスに関する処理を行います。
  3. 処理が完了したら、next 関数を呼び出して、次のミドルウェアまたはルーティングハンドラに処理を移行します。
app.use((req, res, next) => {
  // 処理
  next();
});

エラーハンドリング

エラーハンドリングは、ミドルウェアで重要な役割を果たします。エラーが発生した場合は、適切なエラーメッセージをユーザーに返さなければなりません。

Express.jsは、エラーハンドリング用の組み込みミドルウェアを提供しています。このミドルウェアは、エラーが発生したときに自動的に呼び出され、デフォルトのエラーメッセージを返します。

独自のエラーハンドリングロジックを実装したい場合は、カスタムミドルウェアを作成する必要があります。このミドルウェアは、エラーオブジェクトを引数として受け取り、エラーメッセージの生成、ログ記録、適切なステータスコードの返などを処理することができます。

app.use((err, req, res, next) => {
  console.error(err.stack);

  res.status(500).send('Internal Server Error');
});

ルーティング

ミドルウェアを使用して、ルーティングロジックをカスタマイズすることもできます。Express.jsは、デフォルトのルーティングシステムを提供していますが、より柔軟なルーティングが必要な場合は、カスタムミドルウェアを作成することができます。

カスタムルーティングミドルウェアは、req.url プロパティを使用してリクエストパスを検査し、それに応じて処理を実行することができます。

app.use('/users', (req, res, next) => {
  // /users パスに一致するリクエストのみで処理を実行
  next();
});

app.get('/users/:id', (req, res) => {
  const userId = req.params.id;
  // 特定のユーザーに関する処理
});

サブアプリケーション

サブアプリケーションは、特定の機能をグループ化するために使用できる強力なツールです。サブアプリケーションは、独自のミドルウェア、ルーティング、コントローラーを持つ独立したアプリケーションとして機能します。

サブアプリケーションを作成するには、express() 関数を呼び出して新しい Express インスタンスを作成し、それをメインアプリケーションにマウントします。

const userApp = express();

userApp.use((req, res, next) => {
  // ユーザーサブアプリケーション用のミドルウェア
  next();
});

userApp.get('/profile', (req, res) => {
  // ユーザーのプロフィールに関する処理
});

app.use('/users', userApp);

サードパーティ製ミドルウェア

Express.js には、様々なサードパーティ製ミドルウェアが用意されています。これらのミドルウェアは、認証、セッション管理、ファイルアップロードなどの一般的なタスクを処理するために使用できます。

サードパーティ製ミドルウェアを使用するには、通常、npm または yarn を使用してインストールする必要があります。インストール後、ミドルウェアをアプリケーションに登録して使用することができます。

const expressSession = require('express-session');

app.use(expressSession({
  secret: 'my secret key',
  resave: false,
  saveUninitialized: true
}));

node.js express



Node.js入門: JavaScriptプログラミング

Node. jsは、サーバーサイドのJavaScript実行環境です。つまり、JavaScriptを使ってウェブサーバーやネットワークアプリケーションを開発することができます。Node. js公式サイトからインストーラーをダウンロードします。...


Node.js の `worker_threads` モジュールを使ってマルチスレッド化を行う

Node. js は、JavaScript を使ってサーバーサイドアプリケーションを開発できるプラットフォームです。シングルスレッドで動作するため、従来のマルチスレッド型言語と比べて軽量で高速な処理が可能です。しかし、マルチコアマシンであっても、シングルスレッドで動作する Node...


Node.js でのファイル書き込み:その他の方法

Node. js は、JavaScript をサーバーサイドで実行するためのプラットフォームです。ファイルシステムへのアクセスも可能で、その中でもファイルにデータを書き込む機能は非常に重要です。const fs = require('fs');...


Node.jsでディレクトリ内のファイル一覧を取得するコードの解説

Node. jsでは、fsモジュールを使用してディレクトリ内のファイル一覧を取得することができます。readdirメソッドは、指定されたディレクトリ内のファイル名とサブディレクトリ名を同期的にまたは非同期的に取得します。同期的な使用:注意:...


Node.jsでスタックトレースを出力するコード例の詳細解説

Node. jsでは、エラーが発生した場合にそのエラーのスタックトレースを出力することができます。スタックトレースは、エラーが発生した場所やその原因を特定する上で非常に役立ちます。最も一般的な方法は、エラーオブジェクトの stack プロパティを使用することです。これは、エラーが発生した場所やその呼び出し履歴を文字列として返します。...



SQL SQL SQL SQL Amazon で見る



EJS、Handlebars、Pug:Node.jsで人気テンプレートエンジン徹底比較

テンプレートエンジンを使用すると、以下の利点があります。開発効率の向上: テンプレートを使用することで、HTML コードを毎回手書きする必要がなくなり、開発時間を短縮できます。コードの保守性向上: テンプレートとロジックを分離することで、コードが読みやすくなり、保守しやすくなります。


「JavaScript、jQuery、Node.js」における「jQueryをNode.jsで使用できるか」の説明(日本語)

一般的に、jQueryをNode. jsで直接使用することは推奨されません。Node. jsはサーバーサイドでのJavaScript実行を想定しており、ブラウザ環境向けのjQueryの機能は直接利用できないからです。詳細な解説:jQuery: ブラウザ環境でDOM操作やイベント処理、アニメーションなどを簡潔に記述するためのJavaScriptライブラリです。


Node.jsとは何ですか? (What is Node.js?)

Node. jsは、JavaScriptをサーバーサイドで実行するためのプラットフォームです。つまり、従来ブラウザ上でしか実行できなかったJavaScriptを、サーバー上で実行できるようにする環境を提供します。JavaScript: プログラミング言語のひとつで、主にブラウザ上で動きます。


Node.js デバッグ入門: 実践的なコード例

Node. js アプリケーションのデバッグは、JavaScript コードのエラーや問題を特定し、解決するためのプロセスです。以下に、一般的なデバッグ手法を日本語で説明します。console. log() 関数を使用して、コードのさまざまな箇所で変数の値やメッセージを出力します。


Node.js ファイル自動リロードのコード例解説

Node. jsでファイルを自動リロードする方法について、日本語で説明します。最も一般的な方法は、Node. jsのモジュールを使用することです。代表的なモジュールは以下の通りです。nodemon: Node. js開発用のツールで、ファイルの変更を検知して自動的にプロセスを再起動します。