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企業です。


  
  
  
  

コメント