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());

これにより、ユーザーの入力形式に関わらず一貫したデータ保存が保証されます。

ユースケース

登録フォームを構築し、メール形式、パスワード複雑性、ユーザー名制約を含むクライアントサイドルールに一致するサーバーサイドバリデーションが必要な場合に使用します。

試してみる — JSON to Zod Schema

フルツールを開く