概述
共享 Schema 可消除“客户端认为合法、服务端却不同意”的一类缺陷。在每个信任边界都做校验,但客户端校验只应视为便利,而非安全控制。
关键步骤
- 在单一模块中声明字段、类型与约束。
- 提交时解析,并把问题映射到字段级提示。
- 服务端用同一 Schema 解析,非法时返回 422 与问题列表。
- 在边界处做强转与变换,而不是在组件内部。
验证
- 非法输入在对应字段旁显示错误。
- 服务端会对同样的非法负载返回结构化错误。
- 合法输入通过两层校验且不被改动。
- 不存在只在浏览器生效的校验规则。
注意事项
- 客户端校验服务于可用性,绝不能替代服务端检查。
- 各 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);