カスタムミドルウェアラッパーで Express.js ミドルウェアを拡張する
Express.js でパラメータを受け取るミドルウェアを作成する
パラメータ付きミドルウェアを作成することで、ミドルウェアの動作をより柔軟に制御できます。これは、認証、ログ記録、リクエストの検証など、さまざまな目的に役立ちます。
パラメータ付きミドルウェアの作成方法
Express.js でパラメータ付きミドルウェアを作成するには、以下の手順に従います。
- ミドルウェア関数を作成します。この関数は、
req
、res
、およびオプションのnext
パラメータを受け取ります。 req
オブジェクトを使用して、ミドルウェアに渡されたパラメータにアクセスします。- ミドルウェアのロジックを実装します。
next()
関数を呼び出して、次のミドルウェアに処理をチェーンします。- エラーが発生した場合は、
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
パラメータを受け取り、リクエストのログレベルを設定します。
ミドルウェア関数は req
、res
、および 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
この要求では、paramValue
は my-value
に設定されます。
- ミドルウェアラッパー関数を作成します。この関数は、ミドルウェア関数とパラメータを受け取ります。
- ミドルウェアラッパー関数は、パラメータをミドルウェア関数に渡してから、
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