Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ カスタムミドルウェアの作成 | Express.jsによるウェブアプリケーション開発
Node.jsとExpress.jsによるバックエンド開発

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

メニューを表示するにはスワイプしてください

Express.js では、app.use() メソッドを使用してカスタムミドルウェア関数を作成可能。これらの関数は、req(リクエストオブジェクト)、res(レスポンスオブジェクト)、next(チェーン内の次のミドルウェアへ制御を渡す関数)の3つのパラメータを受け取る。カスタムミドルウェアは、すべてのルートにグローバルに適用することも、ルートパスを指定して特定のルートに適用することも可能。

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

以下は、すべての受信リクエストのタイムスタンプとURLをログ出力するカスタムミドルウェア関数の基本例:

app.use((req, res, next) => {
  const timestamp = new Date().toISOString();
  const url = req.url;
  
  console.log(`[${timestamp}] ${url}`);
  
  next(); // Pass control to the next middleware.
});

この例では、カスタムミドルウェアが各リクエストのタイムスタンプとURLをコンソールに出力する。next() 関数を呼び出すことで、次のミドルウェアへ制御を渡す。

実践例:組み込みミドルウェアとカスタムミドルウェアの組み合わせ

以下は、Expressの組み込みミドルウェアでJSONデータをパースし、その後カスタムミドルウェアでデータを検証する実践的な例:

const express = require('express');
const app = express();

// Use built-in middleware to parse JSON data.
app.use(express.json());

// Custom middleware to validate JSON data.
app.use((req, res, next) => {
  const jsonData = req.body;

  if (!jsonData || Object.keys(jsonData).length === 0) {
    // If the JSON data is missing or empty, send an error response.
    return res.status(400).json({ error: 'Invalid JSON data' });
  }

  // Data is valid; proceed to the next middleware or route.
  next();
});

// Route that expects valid JSON data.
app.post('/api/data', (req, res) => {
  const jsonData = req.body;
  res.status(200).json({ message: 'Data received', data: jsonData });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000.');
});

この例では:

  • 組み込みミドルウェア express.json() を使用して受信したJSONデータをパース;
  • パースしたJSONデータが存在しない、または空の場合に400 Bad Requestレスポンスとエラーメッセージを返すカスタムミドルウェアを作成。データが有効な場合は next() を呼び出してルートへ進む;
  • /api/data ルートは有効なJSONデータを受け取ることを想定。カスタムミドルウェアで検証が通れば、ルートハンドラーがデータを受け取り、成功レスポンスを返す。
コードの説明
expand arrow
  • 1行目: Express.jsフレームワークのインポート;

  • 2行目: express()を呼び出してExpressアプリケーションインスタンスを作成。生成されたappオブジェクトは、ルート、ミドルウェアの定義やHTTPリクエストの処理に使用;

  • 5行目: 組み込みのexpress.json()ミドルウェアを有効化。このミドルウェアは受信したJSONリクエストボディを自動的に解析し、req.bodyを通じてデータを利用可能に;

  • 8〜18行目: 受信したJSONデータを検証するカスタムミドルウェアの定義;

  • req.bodyにデータが含まれているかを確認;

  • リクエストボディが存在しない、または空の場合は400 Bad Requestレスポンスを返す;

  • JSONデータが有効な場合はnext()を呼び出し、次のミドルウェアまたはルートハンドラへ処理を継続;

  • 21〜24行目: POSTに対する/api/dataルートの定義;

  • req.bodyから送信されたJSONデータを取得;

  • 確認メッセージと受信データを含む200 OKレスポンスを返す;

  • 26〜28行目: Expressアプリケーションを起動し、ポート3000でリクエストの受信を開始;

この例は、組み込みミドルウェアとカスタムミドルウェアの両方を使用して、ルートハンドラに到達する前にデータを検証し、データが期待される形式であることを確認してから処理を進める方法を示しています。

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  9

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

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

Express.js では、app.use() メソッドを使用してカスタムミドルウェア関数を作成可能。これらの関数は、req(リクエストオブジェクト)、res(レスポンスオブジェクト)、next(チェーン内の次のミドルウェアへ制御を渡す関数)の3つのパラメータを受け取る。カスタムミドルウェアは、すべてのルートにグローバルに適用することも、ルートパスを指定して特定のルートに適用することも可能。

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

以下は、すべての受信リクエストのタイムスタンプとURLをログ出力するカスタムミドルウェア関数の基本例:

app.use((req, res, next) => {
  const timestamp = new Date().toISOString();
  const url = req.url;
  
  console.log(`[${timestamp}] ${url}`);
  
  next(); // Pass control to the next middleware.
});

この例では、カスタムミドルウェアが各リクエストのタイムスタンプとURLをコンソールに出力する。next() 関数を呼び出すことで、次のミドルウェアへ制御を渡す。

実践例:組み込みミドルウェアとカスタムミドルウェアの組み合わせ

以下は、Expressの組み込みミドルウェアでJSONデータをパースし、その後カスタムミドルウェアでデータを検証する実践的な例:

const express = require('express');
const app = express();

// Use built-in middleware to parse JSON data.
app.use(express.json());

// Custom middleware to validate JSON data.
app.use((req, res, next) => {
  const jsonData = req.body;

  if (!jsonData || Object.keys(jsonData).length === 0) {
    // If the JSON data is missing or empty, send an error response.
    return res.status(400).json({ error: 'Invalid JSON data' });
  }

  // Data is valid; proceed to the next middleware or route.
  next();
});

// Route that expects valid JSON data.
app.post('/api/data', (req, res) => {
  const jsonData = req.body;
  res.status(200).json({ message: 'Data received', data: jsonData });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000.');
});

この例では:

  • 組み込みミドルウェア express.json() を使用して受信したJSONデータをパース;
  • パースしたJSONデータが存在しない、または空の場合に400 Bad Requestレスポンスとエラーメッセージを返すカスタムミドルウェアを作成。データが有効な場合は next() を呼び出してルートへ進む;
  • /api/data ルートは有効なJSONデータを受け取ることを想定。カスタムミドルウェアで検証が通れば、ルートハンドラーがデータを受け取り、成功レスポンスを返す。
コードの説明
expand arrow
  • 1行目: Express.jsフレームワークのインポート;

  • 2行目: express()を呼び出してExpressアプリケーションインスタンスを作成。生成されたappオブジェクトは、ルート、ミドルウェアの定義やHTTPリクエストの処理に使用;

  • 5行目: 組み込みのexpress.json()ミドルウェアを有効化。このミドルウェアは受信したJSONリクエストボディを自動的に解析し、req.bodyを通じてデータを利用可能に;

  • 8〜18行目: 受信したJSONデータを検証するカスタムミドルウェアの定義;

  • req.bodyにデータが含まれているかを確認;

  • リクエストボディが存在しない、または空の場合は400 Bad Requestレスポンスを返す;

  • JSONデータが有効な場合はnext()を呼び出し、次のミドルウェアまたはルートハンドラへ処理を継続;

  • 21〜24行目: POSTに対する/api/dataルートの定義;

  • req.bodyから送信されたJSONデータを取得;

  • 確認メッセージと受信データを含む200 OKレスポンスを返す;

  • 26〜28行目: Expressアプリケーションを起動し、ポート3000でリクエストの受信を開始;

この例は、組み込みミドルウェアとカスタムミドルウェアの両方を使用して、ルートハンドラに到達する前にデータを検証し、データが期待される形式であることを確認してから処理を進める方法を示しています。

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  9
some-alt