Zodスキーマに文字列バリデーション制約を追加する
生成されたZodスキーマに.email()、.url()、.min()、.max()、.regex()、.uuid()などの文字列バリデーションメソッドを追加する方法を学びます。
Validation
詳細な説明
Zodの文字列バリデーション
基本のz.string()バリデーターは任意の文字列を受け入れます。Zodは文字列をさらに制約するための組み込みメソッドを提供し、スキーマを完全なバリデーション層に変えます。
一般的な文字列バリデーター
import { z } from "zod";
const userSchema = z.object({
// メールバリデーション
email: z.string().email("無効なメールアドレスです"),
// URLバリデーション
website: z.string().url("有効なURLを入力してください"),
// UUIDバリデーション
id: z.string().uuid("有効なUUIDを入力してください"),
// 長さ制約
name: z.string().min(1, "名前は必須です").max(100, "名前は100文字以内です"),
// 正規表現パターン
phone: z.string().regex(/^\+?[1-9]\d{1,14}$/, "無効な電話番号です"),
// 開始/終了文字
slug: z.string().startsWith("/", "スラッグは/で始まる必要があります"),
// トリム済み(前後の空白なし)
username: z.string().trim().min(3).max(30),
});
組み込み文字列バリデーター
| メソッド | バリデーション内容 | 例 |
|---|---|---|
.email() |
メール形式 | user@example.com |
.url() |
URL形式 | https://example.com |
.uuid() |
UUID形式 | 550e8400-e29b-41d4-a716-446655440000 |
.cuid() |
CUID形式 | cjld2cyuq0000t3rmniod1foy |
.datetime() |
ISO日時 | 2024-03-15T10:30:00Z |
.ip() |
IPアドレス | 192.168.1.1 |
.emoji() |
絵文字 | 任意の絵文字 |
.min(n) |
最小長 | n文字以上 |
.max(n) |
最大長 | n文字以下 |
.length(n) |
正確な長さ | ちょうどn文字 |
.regex(re) |
正規表現マッチ | カスタムパターン |
カスタムエラーメッセージ
すべてのバリデーターはオプションのエラーメッセージを受け取ります:
z.string()
.min(8, "パスワードは8文字以上必要です")
.max(72, "パスワードは72文字以下にしてください")
.regex(/[A-Z]/, "大文字を1つ以上含む必要があります")
.regex(/[0-9]/, "数字を1つ以上含む必要があります")
変換
Zodはパース中に文字列を変換できます:
const emailSchema = z.string()
.email()
.transform((s) => s.toLowerCase().trim());
これにより、ユーザーの入力形式に関わらず一貫したデータ保存が保証されます。
ユースケース
登録フォームを構築し、メール形式、パスワード複雑性、ユーザー名制約を含むクライアントサイドルールに一致するサーバーサイドバリデーションが必要な場合に使用します。