本页面详细介绍了数据如何通过 Zod 的验证管道,从初始输入到最终输出或错误结果。验证管道是根据模式处理和验证数据的核心机制。有关特定模式类型的信息,请参阅模式类型,有关错误处理的详细信息,请参阅错误处理。
Zod 的验证管道是一个结构化过程,它接收输入数据,根据模式定义进行验证,并产生一个已验证(并可能已转换)的输出或一个错误结果。该管道由多个阶段组成,数据流经类型检查、精炼和转换。
来源
parse 和 safeParse 方法验证管道由几个关键组件协同工作,以处理和验证数据。
| 组件 | 目的 |
|---|---|
ParseInput | 表示带路径的输入数据 |
ParseContext | 包含验证状态、问题、错误映射 |
ParseStatus | 跟踪验证状态(有效、脏、中止) |
ZodType._parse() | 所有模式类型实现的抽象方法 |
OK/DIRTY/INVALID | 不同验证结果的类型 |
来源
ParseContext 和 ParseInput 接口ParseStatus 类定义_parse 方法数据验证流程在所有模式类型中都遵循一致的模式
来源
_parseSync 方法addIssueToContext 函数parse 和 safeParse 方法Zod 使用 ParseStatus 系统来跟踪整个验证过程中数据的有效性。模式的验证可能产生三种状态
status: "valid"):数据完全有效status: "dirty"):数据部分有效但存在问题status: "aborted"):验证因关键故障而中止状态管理对于复杂的嵌套模式尤其重要,因为验证的不同分支可能产生不同的结果。
来源
ParseStatus 类实现INVALID、DIRTY 和 OK 辅助函数验证管道依赖上下文对象来跟踪验证状态并提供错误报告所需的信息。
ParseContext 是一个关键组件,它包含
ParseInput 表示验证过程的结构化输入,包含
来源
ParsePath、ParseContext 和 ParseInput 定义_getOrReturnCtx 和上下文处理Zod 中的每种模式类型都实现了抽象的 _parse 方法,其中包含类型特定的验证逻辑。以下是验证如何通过典型模式类型进行流动的流程
INVALIDParseStatus 来跟踪验证状态字符串验证器展示了一个典型的验证流程
来源
Zod 支持同步和异步验证方法。异步方法处理基于 Promise 的精炼和转换。
| 同步方法 | 异步方法 |
|---|---|
schema.parse() | schema.parseAsync() |
schema.safeParse() | schema.safeParseAsync() |
内部: _parseSync() | 内部: _parseAsync() |
异步变体使用相同的管道,但处理基于 Promise 的操作并返回包含验证结果的 Promise。
来源
_parseSync 实现_parseAsync 实现错误处理贯穿整个验证管道。当验证问题发生时
addIssueToContext 添加到解析上下文parse() 方法,会抛出 ZodError;对于 safeParse(),错误在结果对象中返回关键错误处理组件
addIssueToContext:将问题添加到解析上下文makeIssue:创建带消息的标准化问题对象handleResult:将最终验证结果处理为适当的返回值来源
makeIssue 函数addIssueToContext 函数handleResult 函数验证管道通过精炼和转换扩展了基本类型检查的功能。
精炼允许通过 refine()、refinement() 和 superRefine() 等方法添加自定义验证规则。这些方法创建 ZodEffects 包装器,为管道添加额外的验证步骤。
转换允许在验证过程中使用 transform() 方法更改数据。它们也创建 ZodEffects 包装器,但会更改输出类型。
来源
完整的验证流程结合了管道中从输入到输出的所有元素
来源
parse 和 safeParse 公共方法handleResult 函数addIssueToContext 函数用户通过四种主要方法与验证管道交互,这些方法以不同的错误处理方式处理同步和异步验证
| 方法 | 描述 | 返回值 | 错误处理 |
|---|---|---|---|
parse() | 同步验证 | 已验证数据 | 抛出 ZodError |
safeParse() | 安全同步验证 | {success: true, data} 或 {success: false, error} | 返回错误对象 |
parseAsync() | 异步验证 | Promise | 以 ZodError 拒绝 |
safeParseAsync() | 安全异步验证 | Promise | 以结果对象解决 |
来源
parse 和 safeParse 实现parseAsync 和 safeParseAsync 实现