カスタムバリデーターを使ったexpress-validatorの使い方と動的項目への対応方法

Node.js
スポンサーリンク

Express.jsのカスタムバリデーターを使ったフォーム入力の検証方法を詳しく解説。動的に追加されるフォーム項目への対応方法や複数条件の複雑なバリデーションも紹介します。

目次

  1. express-validatorとは?
  2. 基本的なバリデーションの使い方
  3. カスタムバリデーターとは
  4. カスタムバリデーターの作成
  5. 動的に追加される項目のバリデーション
  6. 複数条件の複雑なバリデーション
  7. まとめと次のステップ

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('バリデーション成功');
});

このカスタムバリデーターでは、usernameforbiddenWordsリストに含まれている場合にエラーを返すようにしています。

動的に追加される項目のバリデーション

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

原稿執筆 株式会社GROWTH JAPAN TECHNOLOGIES  我妻裕太

コメント

タイトルとURLをコピーしました