← 中文资源

简体中文版本

为表单添加 Schema 校验

定义唯一 Schema,客户端即时校验反馈,服务端拒绝非法负载,避免规则只存在于浏览器端。

阅读英文原文

概述

共享 Schema 可消除“客户端认为合法、服务端却不同意”的一类缺陷。在每个信任边界都做校验,但客户端校验只应视为便利,而非安全控制。

关键步骤

  1. 在单一模块中声明字段、类型与约束。
  2. 提交时解析,并把问题映射到字段级提示。
  3. 服务端用同一 Schema 解析,非法时返回 422 与问题列表。
  4. 在边界处做强转与变换,而不是在组件内部。

验证

  • 非法输入在对应字段旁显示错误。
  • 服务端会对同样的非法负载返回结构化错误。
  • 合法输入通过两层校验且不被改动。
  • 不存在只在浏览器生效的校验规则。

注意事项

  • 客户端校验服务于可用性,绝不能替代服务端检查。
  • 各 Schema 库的强转行为不同,应选定一种并全栈保持一致。

适用范围

本条目围绕「为表单添加 Schema 校验」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

const schema = z.object({
  email: z.string().email(),
  age: z.coerce.number().int().min(18),
});
const parsed = schema.safeParse(input);
if (!parsed.success) return res.status(422).json(parsed.error.issues);