Express.jsのカスタムバリデーターを使ったフォーム入力の検証方法を詳しく解説。動的に追加されるフォーム項目への対応方法や複数条件の複雑なバリデーションも紹介します。
目次
- express-validatorとは?
- 基本的なバリデーションの使い方
- カスタムバリデーターとは
- カスタムバリデーターの作成
- 動的に追加される項目のバリデーション
- 複数条件の複雑なバリデーション
- まとめと次のステップ
express-validatorとは?
express-validatorは、Express.jsアプリケーションで入力のバリデーションやサニタイズを簡単に行うためのミドルウェアです。フォームから送信されたデータが正しい形式であるかをチェックし、不正なデータがサーバーに渡るのを防ぎます。これにより、アプリケーションのセキュリティを高めることができます。
基本的なバリデーションの使い方
まずは、express-validator
を使った基本的なバリデーションの例を見てみましょう。
const { body, validationResult } = require('express-validator');
app.post('/submit', [
body('username').isLength({ min: 5 }).withMessage('ユーザー名は5文字以上である必要があります'),
body('email').isEmail().withMessage('有効なメールアドレスを入力してください')
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
// 正常処理
res.send('バリデーション成功');
});
このコードでは、username
が少なくとも5文字以上であるか、email
が有効な形式かをチェックしています。もしバリデーションに失敗した場合、エラーメッセージが返されます。
カスタムバリデーターとは?
カスタムバリデーターとは、特定のニーズに応じて独自のバリデーションロジックを実装できる機能です。これにより、標準的なバリデーションではカバーできないユースケースに対応することができます。
カスタムバリデーターの作成
次に、express-validator
でカスタムバリデーターを作成する方法を紹介します。例えば、特定の値が「禁止された単語リスト」に含まれていないことを確認するカスタムバリデーターを作成します。
const { body, validationResult } = require('express-validator');
const forbiddenWords = ['admin', 'root'];
app.post('/submit', [
body('username').custom(value => {
if (forbiddenWords.includes(value)) {
throw new Error('このユーザー名は使用できません');
}
return true;
})
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
res.send('バリデーション成功');
});
このカスタムバリデーターでは、username
がforbiddenWords
リストに含まれている場合にエラーを返すようにしています。
動的に追加される項目のバリデーション
express-validator
のカスタムバリデーターは通常、特定の入力項目に対して個別にバリデーションを行うために使用されます。しかし、ここでは、リクエストの全体(req.body
)に対してカスタムバリデーターを適用し、動的に生成された項目名(input-name-
で始まるもの)を一括して検出し、それぞれに対してバリデーションを行っています。
動的にフォーム項目が追加される場合、例えば「input-name
」が「input-name-1
」、「input-name-2
」のように連番で増えるとき、その項目をバリデーションする方法を見ていきましょう。
const { body, validationResult } = require('express-validator');
app.post('/submit', [
body('input-name-*').custom((value, { req }) => {
const keys = Object.keys(req.body).filter(key => key.startsWith('input-name-'));
keys.forEach(key => {
if (!value || value.trim() === '') {
throw new Error(`${key} は空欄にできません`);
}
});
return true;
})
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
res.send('バリデーション成功');
});
このコードでは、body().custom()
を使ってリクエストボディ全体を一度にチェックし、その中から特定のパターン(input-name-
で始まる)に一致するキーを抽出してバリデーションしています。このアプローチは次のような特徴があります。
カスタムバリデーターの拡張: 通常のカスタムバリデーターは単一のフィールドに対して行いますが、この方法では、リクエスト内の複数フィールドに対して一括して行うバリデーションロジックを簡単に実装できます。
全体バリデーション: リクエストボディ全体に対してバリデーションを行うため、特定のパターンを持つ複数のフィールドをまとめてチェックするのに適しています。
動的キーの処理: req.body
のキーを動的に取得し、パターンマッチによって特定のキーに対してのみバリデーションを適用することができます。
上記の例はカスタムバリデーターの一例であり、express-validator
の柔軟性を活かして特定のニーズに合わせたバリデーションを行うための手段です。通常のフィールドバリデーションを超えて、リクエスト全体に対してカスタムバリデーションを適用したい場合に非常に便利です。
複数条件の複雑なバリデーション
次に、複数の条件を組み合わせた複雑なバリデーションについて説明します。例えば、以下の条件を満たすフィールドのバリデーションを行います:
- フィールドが存在する場合、数値であり、範囲が10から100の間である。
- さらに、数値が偶数でなければならない。
これを実現するカスタムバリデーターを作成します。
const { body, validationResult } = require('express-validator');
app.post('/submit', [
body('age').optional().isInt({ min: 10, max: 100 }).withMessage('年齢は10から100の範囲でなければなりません')
.custom(value => {
if (value % 2 !== 0) {
throw new Error('年齢は偶数でなければなりません');
}
return true;
})
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
res.send('バリデーション成功');
});
この例では、age
フィールドが存在する場合、まずその値が10から100の範囲内の整数であるかをチェックし、さらにその値が偶数であることを確認しています。もし条件に合わない場合、エラーメッセージを返します。
まとめと次のステップ
express-validator
は、Express.jsアプリケーションにおける入力データのバリデーションを強化する強力なツールです。カスタムバリデーターを使えば、アプリケーションに特化した柔軟なバリデーションを実現できます。また、動的に追加されるフォーム項目に対しても適切にバリデーションを適用できるよう、正規表現やreq.body
の動的処理を活用することがポイントです。
複数の条件を組み合わせた複雑なバリデーションも可能ですので、アプリケーションのニーズに合わせてバリデーターを構築していくことができます。次に学ぶべきこととして、さらに高度なバリデーションや、他のセキュリティ対策も学んでいくと良いでしょう。
GROWTH JAPAN TECHNOLOGIESは宮城県仙台市のAI企業です。
コメント