Node.js + Express で複数パラメータを扱う Web アプリケーション開発
Express で URL に複数のパラメータを使用する
Express では、2 種類のパラメータを主に使用します。
パスパラメータ
パスパラメータは、URL のパス内にコロン (:) で囲まれた形式で定義されます。例えば、次のような URL です。
/users/:id/books/:bookId
この例では、users
と books
は静的セグメントで、:id
と :bookId
はパスパラメータです。リクエストが上記の URL に到達すると、Express はパラメータの値を req.params
オブジェクトに格納します。このオブジェクトを使用して、パラメータ値にアクセスできます。
app.get('/users/:id/books/:bookId', function(req, res) {
const userId = req.params.id;
const bookId = req.params.bookId;
// パラメータ値を使用して処理を行う
});
クエリパラメータ
クエリパラメータは、URL の末尾に ?
記号の後に続く形で定義されます。例えば、次のような URL です。
/search?q=キーワード&sort=価格
app.get('/search', function(req, res) {
const keyword = req.query.q;
const sort = req.query.sort;
// クエリパラメータ値を使用して処理を行う
});
複数のパラメータを使用する
URL に複数の同名パラメータを含めることもできます。例えば、次のような URL です。
/tags/javascript/jquery/ajax
この例では、javascript
、jquery
、ajax
はすべてタグを表すパラメータです。Express は、同名のパラメータを配列として req.query
オブジェクトに格納します。
app.get('/tags/:tagName+', function(req, res) {
const tags = req.query.tagName;
// タグ配列を使用して処理を行う
});
まず、必要なライブラリをインストールします。
npm install express
次に、Express アプリケーションを作成します。
const express = require('express');
const app = express();
ルートの定義
ユーザーと商品情報を扱う 2 つのルートを定義します。
// ユーザー情報取得
app.get('/users/:id', function(req, res) {
const userId = req.params.id;
// データベースからユーザー情報取得
const user = getUserById(userId);
if (user) {
res.json(user);
} else {
res.status(404).send('ユーザーが見つかりません');
}
});
// 商品情報取得
app.get('/products/:productId', function(req, res) {
const productId = req.params.productId;
const categoryId = req.query.categoryId;
// データベースから商品情報取得
const product = getProductById(productId, categoryId);
if (product) {
res.json(product);
} else {
res.status(404).send('商品が見つかりません');
}
});
上記のコードでは、getUserById
と getProductById
は、仮の関数として定義されています。実際のアプリケーションでは、データベースから実際にデータを取得するロジックを実装する必要があります。
アプリケーションの実行
最後に、アプリケーションを起動します。
app.listen(3000, function() {
console.log('サーバーを起動しました。ポート: 3000');
});
これで、ブラウザで次の URL にアクセスすると、対応する情報が JSON 形式で返されます。
- ユーザー情報: http://localhost:3000/users/123
- 商品情報: http://localhost:3000/products/456?categoryId=2
- この例では、基本的なパラメータの取得方法のみを示しています。実際には、バリデーションやエラー処理などのロジックを追加する必要があります。
- パラメータの型チェックやサニタイズを行うことも重要です。
- より複雑なパラメータ構造を扱う場合は、専用のライブラリを使用するのも有効です。
カスタムミドルウェアを作成して、パラメータの処理をカプセル化することができます。例えば、次のようにパラメータのバリデーションを行うミドルウェアを作成できます。
function validateUserIdParam(req, res, next) {
const userId = req.params.id;
if (!isValidUserId(userId)) {
res.status(400).send('無効なユーザー ID です');
return;
}
next();
}
app.get('/users/:id', validateUserIdParam, function(req, res) {
// ユーザー情報取得処理
});
このミドルウェアをルートハンドラーの前に呼び出すことで、req.params.id
の値が有効なユーザー ID であることを確認できます。
ルートパラメータの制約
Express 4.0 以降では、ルートパラメータに対して制約を定義することができます。例えば、次のように :id
パラメータが数値であることを制約できます。
app.get('/users/:id(\\d+)', function(req, res) {
// ユーザー情報取得処理
});
この制約が満たされない場合、Express は自動的に 400 バッドリクエストエラーを返します。
第三者ライブラリの利用
Express と統合できる、パラメータ処理を専門としたライブラリもいくつかあります。例えば、express-param-validator
や body-parser
などのライブラリが人気です。
これらのライブラリは、より複雑なパラメータ構造の処理や、バリデーション、サニタイズなどの機能を提供します。
上記以外にも、状況に応じてさまざまなアプローチが考えられます。適切な方法は、アプリケーションの要件や開発者の好みによって異なります。
node.js express