カスタムミドルウェアラッパーで Express.js ミドルウェアを拡張する

2024-06-14

Express.js でパラメータを受け取るミドルウェアを作成する

パラメータ付きミドルウェアを作成することで、ミドルウェアの動作をより柔軟に制御できます。これは、認証、ログ記録、リクエストの検証など、さまざまな目的に役立ちます。

パラメータ付きミドルウェアの作成方法

Express.js でパラメータ付きミドルウェアを作成するには、以下の手順に従います。

  1. ミドルウェア関数を作成します。この関数は、reqres、およびオプションの next パラメータを受け取ります。
  2. req オブジェクトを使用して、ミドルウェアに渡されたパラメータにアクセスします。
  3. ミドルウェアのロジックを実装します。
  4. next() 関数を呼び出して、次のミドルウェアに処理をチェーンします。
  5. エラーが発生した場合は、next(err) を呼び出してエラーを伝えます。

const express = require('express');

// ミドルウェア関数を作成します
function logger(level) {
  return function (req, res, next) {
    console.log(`${level}: ${req.method} ${req.url}`);
    next();
  };
}

// アプリケーションを作成します
const app = express();

// ミドルウェアを適用します
app.use(logger('info'));

// ルートハンドラーを追加します
app.get('/', (req, res) => {
  res.send('Hello, World!');
});

// サーバーを起動します
app.listen(3000, () => {
  console.log('Server listening on port 3000');
});

この例では、logger というミドルウェア関数を作成します。この関数は level パラメータを受け取り、リクエストのログレベルを設定します。

ミドルウェア関数は reqres、および next パラメータを受け取ります。req オブジェクトを使用して、level パラメータにアクセスできます。

ミドルウェアのロジックは、リクエストのメソッドと URL をコンソールにログ出力することです。

この例を実行すると、次の出力がコンソールに表示されます。

info: GET /

パラメータの使用方法

ミドルウェア関数内で、req オブジェクトを使用して、リクエストからパラメータにアクセスできます。

たとえば、リクエストヘッダーからパラメータにアクセスするには、次のようにします。

const value = req.headers['my-header'];
const value = req.body.myParam;
const value = req.query.myParam;



サンプルコード:認証ミドルウェア

const express = require('express');
const jwt = require('jsonwebtoken');

// 認証ミドルウェア関数を作成します
function auth(secret) {
  return function (req, res, next) {
    const token = req.headers['authorization'];

    if (!token) {
      return res.status(401).send('トークンが提供されていません');
    }

    try {
      const decoded = jwt.verify(token, secret);
      req.user = decoded;
      next();
    } catch (err) {
      return res.status(401).send('無効なトークン');
    }
  };
}

// アプリケーションを作成します
const app = express();

// シークレットキーを設定します
const secret = 'my-secret-key';

// 認証ミドルウェアを適用します
app.use(auth(secret));

// ルートハンドラーを追加します
app.get('/', (req, res) => {
  res.send('こんにちは、' + req.user.name + '!');
});

// サーバーを起動します
app.listen(3000, () => {
  console.log('Server listening on port 3000');
});

この例を実行するには、まず jsonwebtoken パッケージをインストールする必要があります。

npm install jsonwebtoken

次に、シークレットキーを設定する必要があります。これは、環境変数または設定ファイルに保存できます。

この例では、シークレットキーを my-secret-key に設定しています。

サーバーを起動すると、次の要求を送信できます。

GET /

この要求が成功すると、次の応答が返されます。

Hello, John Doe!

ただし、有効な認証トークンなしで要求を送信すると、次の応答が返されます。

Unauthorized

この例は、基本的な認証ミドルウェアの実装を示しています。実際のアプリケーションでは、より複雑なロジックを実装する必要がある場合があります。たとえば、ユーザーのロールと権限に基づいて、アクセスを制御できます。




Express.js でパラメータ付きミドルウェアを作成するその他の方法

パスパラメータを使用して、ミドルウェアにパラメータを渡すことができます。これを行うには、次の構文を使用します。

app.use('/path/:param', middleware(paramValue));

この例では、middleware ミドルウェアは paramValue パラメータを受け取ります。パラメータ値は、URL の /path/:param 部分に指定されます。

たとえば、次の要求を送信できます。

GET /path/my-value

この要求では、paramValuemy-value に設定されます。

  1. ミドルウェアラッパー関数を作成します。この関数は、ミドルウェア関数とパラメータを受け取ります。
  2. ミドルウェアラッパー関数は、パラメータをミドルウェア関数に渡してから、next() 関数を呼び出します。

たとえば、次のミドルウェアラッパー関数を作成できます。

function withParam(param, middleware) {
  return function (req, res, next) {
    req.myParam = param;
    middleware(req, res, next);
  };
}

このミドルウェアラッパーを使用して、次のミドルウェアをラップできます。

function myMiddleware(req, res, next) {
  const value = req.myParam;
  console.log(value);
  next();
}

次に、次のようにミドルウェアを適用できます。

app.use('/path', withParam('my-value', myMiddleware));

この例では、myMiddleware ミドルウェアは my-value パラメータを受け取ります。

Express.js でパラメータ付きミドルウェアを作成するには、さまざまな方法があります。ニーズに合った方法を選択してください。

  • クエリ文字列: これは、パラメータを渡す最も一般的な方法ですが、URL を長くする可能性があります。
  • パスパラメータ: これは、URL をよりクリーンにするのに役立ちますが、ルート定義が複雑になる可能性があります。
  • カスタムミドルウェアラッパー: これは、より柔軟な制御を提供しますが、コードが増える可能性があります。

どの方法を選択する場合でも、ミドルウェア関数がパラメータをどのように受け取るのかを明確に記述することが重要です。これにより、コードをより読みやすく、保守しやすくなります。


node.js express


【初心者向け】Express アプリ開発で役立つ! require 関数でモジュールオプションを自在に設定

モジュールによっては、オプション情報や設定値を require 関数に引数として渡すことで、動作をカスタマイズすることができます。上記の例では、express モジュールを require する際に、 { view engine: 'pug' } というオプションオブジェクトを渡しています。これは、Express アプリケーションが Pug テンプレートエンジンを使用することを示しています。...


【Node.js】process.env.PORTの変更方法を徹底解説!コマンドライン、環境変数、.envファイル、その他も網羅

コマンドライン引数を使用するNode. js スクリプトを実行する際に、-p フラグとポート番号を指定することで、process. env. PORT の値を設定できます。このコマンドは、app. js スクリプトをポート 3000 で実行します。...


Node.js 開発者必見! Git で "node_modules" フォルダを賢く管理する方法

一般的に、"node_modules" フォルダを Git リポジトリに含めるべきではありません。理由は以下の通りです。容量が大きくなる: "node_modules" フォルダは、プロジェクトで使用しているすべての Node. js パッケージのライブラリファイルを含むため、非常に大きくなります。これは、リポジトリのサイズを肥大化させ、バージョン管理や共有を難しくします。...


jest.requireActualとjest.unmockの使い方

Jest はデフォルトで自動モック機能を有効にしており、ES6 モジュールインポートも自動的にモックされます。 自動モックを使用するには、モジュールを直接インポートするだけです。この例では、myModule. js モジュールを myTest...


【完全網羅】Angularで発生するあらゆるエラーの原因と解決方法を大公開! "Could not find the implementation for builder @angular-devkit/build-angular:dev-server on ng serve command" エラーもこれで解決!

このエラーは、Angular CLI コマンド ng serve を実行した際に発生する可能性があります。これは、Angular プロジェクトのビルドに必要なパッケージが不足しているか、破損していることを示しています。原因このエラーの主な原因は以下の2つです。...