ExpressでGETパラメータを取得する方法
Node.jsのExpressフレームワークで、URLの「?」以降に続くGETパラメータを取得する方法について日本語で解説します。
req.queryオブジェクトを使用する
最も一般的な方法です。Expressは、リクエストオブジェクトのreq.query
プロパティにGETパラメータをオブジェクトとして格納します。
const express = require('express');
const app = express();
app.get('/users', (req, res) => {
const name = req.query.name;
const age = req.query.age;
// GETパラメータを処理する
console.log('Name:', name);
console.log('Age:', age);
res.send('Hello, ' + name + '! You are ' + age + ' years old.');
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
上記の例では、URLがhttp://localhost:3000/users?name=John&age=30
の場合、req.query
オブジェクトは{ name: 'John', age: '30' }
となります。
query-stringモジュールを使用する
より複雑なGETパラメータの処理が必要な場合は、query-string
モジュールを使用することもできます。
const express = require('express');
const queryString = require('query-string');
const app = express();
app.get('/search', (req, res) => {
const queryParams = queryString.parse(req.url);
const query = queryParams.query;
const page = queryParams.page;
// GETパラメータを処理する
console.log('Query:', query);
console.log('Page:', page);
res.send('Search results for: ' + query);
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
この方法では、req.url
を解析してGETパラメータを取得します。
ミドルウェアを使用する
複数のルートでGETパラメータを処理する必要がある場合は、ミドルウェアを使用することもできます。
const express = require('express');
const app = express();
function parseQueryParams(req, res, next) {
const queryParams = queryString.parse(req.url);
req.query = queryParams;
next();
}
app.use(parseQueryParams);
app.get('/users', (req, res) => {
// GETパラメータを処理する
console.log('Name:', req.query.name);
console.log('Age:', req.query.age);
res.send('Hello, ' + req.query.name + '! You are ' + req.query.age + ' years old.');
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
この方法では、ミドルウェアがリクエストを処理する前にGETパラメータを解析し、req.query
オブジェクトに格納します。
コードの全体像
上記のコードは、Node.jsのExpressフレームワークを使って、URLの「?」以降に付与されたGETパラメータを取得し、処理する方法を示しています。
- コードの解説
name
とage
というパラメータをreq.query
から取得し、変数に代入しています。- 取得したパラメータを使って、シンプルなメッセージを生成し、クライアントに返しています。
req.query
:リクエストオブジェクトのreq.query
プロパティは、GETパラメータをキーと値のペアで格納したオブジェクトです。
- コードの解説
req.url
からquery-string
モジュールを使って、GETパラメータを解析し、queryParams
オブジェクトに格納しています。queryParams
からquery
とpage
というパラメータを取得し、処理しています。
- 例
http://localhost:3000/search?query=nodejs&page=2
というURLの場合、queryParams
は{ query: 'nodejs', page: '2' }
となります。 - query-stringモジュール
より柔軟なパラメータ処理のために、query-string
モジュールを使用します。
- コードの解説
parseQueryParams
というミドルウェア関数で、req.url
を解析し、req.query
に結果を格納しています。- このミドルウェアを
app.use
で登録することで、全てのルートでreq.query
が利用可能になります。
- ミドルウェア
複数のルートで共通してGETパラメータを処理したい場合に、ミドルウェアを使用します。
各コードのポイント
- ミドルウェアは、コードの重複を減らし、可読性を向上させることができます。
query-string
モジュールは、より複雑なパラメータ処理が必要な場合に有効です。req.query
は、GETパラメータを簡単に取得できる便利なプロパティです。
- レスポンスオブジェクト
サーバーからクライアントへ送り返すレスポンスに関する情報を格納したオブジェクトです。 - リクエストオブジェクト
クライアントからサーバーに送られてきたリクエストに関する情報を格納したオブジェクトです。 - GETパラメータ
URLの「?」以降に付与される、キーと値のペアで表されるデータです。
より詳しく知りたい場合
- query-stringモジュールのドキュメント
query-string
モジュールの使い方について詳細な情報が記載されています。 - Expressの公式ドキュメント
Expressの機能やAPIについて詳細な情報が記載されています。
- セキュリティ面では、GETパラメータに直接ユーザーが入力した値を使用する場合は、XSSなどの攻撃に注意する必要があります。
- GETパラメータの値は、文字列として取得されます。数値として扱いたい場合は、適切な型変換を行う必要があります。
ルーティングパラメータと組み合わせる
GETパラメータだけでなく、URLのパス部分に含まれるパラメータも同時に取得したい場合、ルーティングパラメータと組み合わせる方法が考えられます。
const express = require('express');
const app = express();
app.get('/users/:userId/profile', (req, res) => {
const userId = req.params.userId;
const name = req.query.name;
// ...
});
この例では、userId
はルーティングパラメータ、name
はGETパラメータとして取得しています。
ミドルウェアでカスタム処理
より高度なパラメータ処理が必要な場合、独自のミドルウェアを作成してリクエストオブジェクトに任意の情報を追加できます。
const express = require('express');
const app = express();
function customQueryParams(req, res, next) {
// カスタムなパラメータ処理
req.customParams = {
// ...
};
next();
}
app.use(customQueryParams);
app.get('/users', (req, res) => {
const customParam = req.customParams.someValue;
// ...
});
サードパーティライブラリを利用
express-validator
などのバリデーションライブラリを利用すると、入力値の検証と同時にパラメータを取得することができます。
const express = require('express');
const { check, validationResult } = require('express-validator');
const app = express();
app.get('/users', [
check('name').isLength({ min: 5 })
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
const name = req.body.name; // バリデーション後に取得
// ...
});
URLエンコード/デコード
GETパラメータはURLエンコードされているため、特殊文字を含むパラメータを扱う場合は、decodeURIComponent()
関数を使ってデコードする必要があります。
const express = require('express');
const app = express();
app.get('/search', (req, res) => {
const searchQuery = decodeURIComponent(req.query.query);
// ...
});
どの方法を選ぶべきか?
- URLエンコード/デコード
特殊文字を含むパラメータを扱う場合に必要です。 - バリデーション
入力値の検証が必要な場合に便利です。 - カスタム処理
独自のロジックでパラメータを処理したい場合に有効です。 - ルーティングパラメータとの組み合わせ
URLの構造とパラメータの組み合わせによって使い分けます。 - シンプルなケース
req.query
オブジェクトで十分な場合が多いです。
ExpressでGETパラメータを取得する方法は、req.query
オブジェクトを使うのが一般的ですが、状況に応じて様々な方法が考えられます。これらの方法を組み合わせることで、より複雑なアプリケーションに対応することができます。
選択する際のポイント
- 可読性
コードの可読性を高めるために、適切な方法を選択する - セキュリティ
ユーザーが入力した値を直接使用する場合は、XSSなどの攻撃に注意し、適切なサニタイズを行う - 処理の複雑さ
シンプルな処理であればreq.query
で十分、複雑な処理であればミドルウェアやサードパーティライブラリを検討
- POSTパラメータ
POSTメソッドで送信されるパラメータは、req.body
オブジェクトで取得します。
node.js express query-string