处理前先校验
在中间件而非处理函数中解析 body。失败返回 400 与字段级错误映射;成功则用解析结果替换 body,处理函数看到的是带类型数据,不会因缺字段崩溃。
const result = schema.safeParse(req.body);
if (!result.success) {
return res.status(400).json({ errors: result.error.flatten() });
}
req.body = result.data;
推导类型
用 z.infer 从 schema 得到 TypeScript 类型。处理函数参数有类型,字段拼写错误是编译错误。schema 同时是运行时校验与编译时类型的唯一真相。
type Input = z.infer<typeof schema>;
function handler(body: Input) { /* body.email is string */ }
预期结果
非法请求得到 400 与每字段一条消息,合法请求带类型到达处理函数,处理函数不再因缺字段或畸形字段崩溃。schema 同时驱动校验与类型。zod 只校验形状不校验授权,合法负载仍可能被禁止;带 refine 的 schema 每次解析都跑 refine,大数组上可能昂贵。