全栈开发, 精选文章

nextjs全局表单错误管理

nextjs全局表单错误管理

自定义错误映射

import { z } from "zod";

const customErrorMap: z.ZodErrorMap = (issue, ctx) => {
    switch (issue.code) {
        case z.ZodIssueCode.invalid_type:
            if (issue.received === "undefined" || issue.received === "null") {
                return { message: "This field is required" };
            }
            if (issue.expected === "string") {
                return { message: "Please enter text" };
            }
            if (issue.expected === "number") {
                return { message: "Please enter a number" };
            }
            return { message: "Invalid value type" };

        case z.ZodIssueCode.too_small:
            if (issue.type === "string") {
                return { message: `Minimum ${issue.minimum} characters required` };
            }
            if (issue.type === "number") {
                return { message: `Number muest be greater than or equal to ${issue.minimum}` };
            }
            return { message: "Value is too small" };

        case z.ZodIssueCode.too_big:
            if (issue.type === "string") {
                return { message: `Maximum ${issue.maximum} characters required` };
            }
            if (issue.type === "number") {
                return { message: `Number muest be less than or equal to ${issue.maximum}` };
            }
            return { message: "Value is too large" };

        case z.ZodIssueCode.invalid_string:
            if (issue.validation === "email") {
                return { message: "Please enter a valid URL" };
            }
            if (issue.validation === "url") {
                return { message: "Invalid text format" };
            }
            return { message: "Invalid text format" }

        case z.ZodIssueCode.invalid_date:
            return { message: "PLease encter a valid date" };

        case z.ZodIssueCode.custom:
            return { message: issue.message || "Invalid value" };

        default:
            return { message: ctx.defaultError };
    }
};

export { customErrorMap };

在layout中添加到全局

import z from "zod";
import { customErrorMap } from "@/lib/customErrorMap";
// Layout 加载 → z.setErrorMap(customErrorMap) → 全局生效 → 
// 所有 Zod 验证失败 → 使用自定义消息 → 用户看到友好的错误提示
z.setErrorMap(customErrorMap);