express-validator、is-my-json-valid、joi、validator は、すべて Node.js アプリケーションでデータの整合性を保つための検証ツールですが、それぞれ役割と適用範囲が異なります。validator は文字列検証に特化した軽量ライブラリであり、express-validator はこれを Express ミドルウェアとしてラップしたものです。joi はオブジェクトスキーマの定義に強く、複雑なデータ構造の検証に適しています。is-my-json-valid は JSON Schema 仕様に基づいた検証を行いますが、他のモダンな替代品と比較して機能制限があります。
Node.js 生態系において、ユーザー入力や外部データの検証はセキュリティと安定性の要です。express-validator、is-my-json-valid、joi、validator はそれぞれ異なる哲学に基づいて設計されており、単に「検証する」という目的は同じでも、コードの書き方、保守性、そして適用できる場面が大きく異なります。本稿では、これら 4 つのライブラリを実際のエンジニアリング視点で比較し、どの状況でどれを選ぶべきかを明確にします。
ライブラリ選定で最も重要なのは、「何を検証したいか」と「どこで検証したいか」です。
validator は、個々の文字列値を検証する関数の集合です。
true/false または変換結果を返します。// validator: 単一文字列の検証
const validator = require('validator');
const email = 'user@example.com';
if (!validator.isEmail(email)) {
throw new Error('Invalid email');
}
joi は、オブジェクト全体のスキーマを定義して検証します。
// joi: オブジェクトスキーマの検証
const Joi = require('joi');
const schema = Joi.object({
email: Joi.string().email().required(),
age: Joi.number().min(18)
});
const { error } = schema.validate({ email: 'user@example.com', age: 20 });
if (error) throw error;
express-validator は、Express ミドルウェアとして動作します。
validator ライブラリをベースにしています。req) から直接値を読み取り、検証します。// express-validator: ミドルウェアチェーンによる検証
const { check, validationResult } = require('express-validator');
app.post('/register', [
check('email').isEmail(),
check('password').isLength({ min: 6 })
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) return res.status(400).json({ errors: errors.array() });
// 処理続行
});
is-my-json-valid は、JSON Schema 仕様に基づいて検証します。
// is-my-json-valid: JSON Schema による検証
const validator = require('is-my-json-valid');
const schema = {
type: 'object',
properties: {
email: { type: 'string', format: 'email' }
},
required: ['email']
};
const validate = validator(schema);
if (!validate({ email: 'user@example.com' })) {
console.error(validate.errors);
}
プロジェクトのアーキテクチャによって、ライブラリがフレームワークに縛られることは大きな制約になります。
express-validator は Express に強く依存しています。
joi と validator はフレームワーク独立です。
is-my-json-valid もフレームワーク独立ですが、仕様に依存します。
検証失敗時にどう扱うかも、ユーザー体験とデバッグのしやすさに直結します。
express-validator は、エラーを構造化して提供します。
validationResult 関数で簡単にエラー配列を取得できます。// express-validator: 構造化されたエラー取得
const errors = validationResult(req);
// errors.array() で統一された形式でエラー一覧を取得可能
joi は、詳細なエラーオブジェクトを返します。
// joi: 詳細なエラー情報
const { error } = schema.validate(data);
// error.details 配列に各フィールドの失敗理由が含まれる
validator は、真偽値または変換結果のみを返します。
// validator: 真偽値による判定
if (!validator.isURL(url)) {
// 自分でエラーメッセージを定義する必要がある
throw new Error('Invalid URL provided');
}
is-my-json-valid は、検証関数にエラー配列が付与されます。
// is-my-json-valid: errors 配列による確認
if (!validate(data)) {
// validate.errors にスキーマ違反の詳細が入る
console.log(validate.errors);
}
ライブラリのメンテナンス状況は、長期プロジェクトにおいてリスク管理の重要な要素です。
validator と express-validator は活発に維持されています。
joi も広く使われており安定しています。
is-my-json-valid は注意が必要です。
ajv などのより現代的な替代品の評価を推奨します。| 特徴 | express-validator | joi | validator | is-my-json-valid |
|---|---|---|---|---|
| 主な用途 | Express ミドルウェア | オブジェクトスキーマ | 文字列検証 | JSON Schema 検証 |
| フレームワーク | Express 専用 | 独立 | 独立 | 独立 |
| 検証単位 | リクエスト全体 | オブジェクト構造 | 単一文字列 | JSON 構造 |
| エラー処理 | 構造化され統合容易 | 詳細なエラーオブジェクト | 真偽値のみ | エラー配列 |
| 保守状況 | 活発 | 安定 | 活発 | 低調(要注意) |
プロジェクトの要件に応じて、以下のように選定するのが賢明です。
Express API を構築している場合:
express-validator が最適です。リクエストライフサイクルに自然に統合され、ボイラープレートコードを減らせます。
複雑なビジネスロジックの検証が必要な場合:
joi を選択してください。スキーマ定義によりコードが自己文書化され、ドメイン層の独立性を保てます。
軽量なスクリプトや単一値のチェックの場合:
validator 十分です。依存関係を最小限に抑えたい場合に適しています。
JSON Schema 準拠が必須の場合:
is-my-json-valid は利用可能ですが、新規プロジェクトでは ajv などのよりパフォーマンスが高く維持されているライブラリを比較検討することを強く推奨します。
入力検証はアプリケーションの防衛線です。単に機能するものを選ぶだけでなく、チームのスキルセット、アーキテクチャの方向性、そして将来の保守性を考慮して選定しましょう。
Express.js を使用したバックエンドまたは BFF 層を持っており、リクエストオブジェクトに対してミドルウェアチェーンで検証を行いたい場合に選択します。validator の機能をそのまま活用でき、エラー処理も Express のフローに統合されるため、Web API の入力チェックに最適です。
JSON Schema Draft 4 への準拠が必須で、外部から提供されたスキーマ定義をそのまま使用したい場合に適しています。ただし、メンテナンス頻度が低いため、新規プロジェクトでは ajv などのより活発な替代品を検討することを推奨します。
複雑なオブジェクト構造やネストされたデータの検証が必要な場合に選択します。スキーマ定義が明確で可読性が高く、Express 以外の環境でも汎用的に使えるため、ドメイン層の検証ロジックを分離したいアーキテクチャに向いています。
Express に依存せず、単純な文字列形式(メール、URL、 credit card など)を検証したい場合に選択します。他のライブラリの基盤としても使われており、バンドルサイズを最小限に抑えたい軽量なユースケースで真価を発揮します。
An express.js middleware for validator.
npm install express-validator
Also make sure that you have Node.js 14 or newer in order to use it.
Please refer to the documentation website on https://express-validator.github.io.
Check the GitHub Releases page.
MIT License