数据校验Validation
数据与账号先检查用户提交的数据是否完整、格式是否正确
邮箱格式、标题长度和价格范围都需要数据校验。前端检查可以立即提示用户,但可能被绕过;后端仍要重新校验,并用明确错误说明哪一项不符合规则。
email✓ oil@example.com
age✕ 必须是 1–120
role✓ user
什么时候用
- 在后端检查类型、必填、范围、长度和允许值一眼看清字段规则email必填 · 邮箱格式price数字 · 大于 0roleuser / admin
- 返回字段级错误,让前端知道该在输入框旁提示什么错误要指向具体字段商品价格-3输入框下方价格必须大于 0
- 先校验,再执行业务和数据库写入校验通过才写数据库收到输入→规则检查→写入数据库
- 尽量使用框架的 schema 校验能力,规则集中在一处规则集中在一份 Schemaemail: string().email()price: number().positive()role: enum(["user", "admin"])
什么时候不用
- 只做前端校验:请求可以绕过页面直接发到接口页面检查可以被绕过跳过表单→直接请求 API→后端仍需校验
- 校验失败仍返回 200:前端会误以为成功状态码与结果互相矛盾HTTP200 OK响应内容error: invalid email前端很容易把失败当成功
- 把技术堆栈和数据库报错原样展示给用户不要把内部报错丢给用户PrismaClientKnownRequestErrorat node_modules/runtime/library.js:129:42页面应该显示:暂时无法保存,请稍后重试
- 偷偷修正关键输入,例如把负价格自动变成正数不要偷偷改关键数据用户输入价格 -99 → 系统擅自改成价格 99应明确拒绝并让用户确认
组成结构 · Anatomy
原始输入→校验规则→干净数据或明确错误
1原始输入Raw Input来自表单、URL、请求头或第三方系统,都不能默认可信
2规则Schema定义字段类型、是否必填、范围、长度和允许值
3结果Result通过后得到可安全使用的数据,失败时得到结构化错误
典型使用场景
注册邮箱和密码
注册校验在字段旁说明怎样修改
创建账号
邮箱格式不完整 · 密码至少 8 位
创建商品价格
商品价格拒绝不合理数值
校验结果价格必须大于 0
文章标题长度
文章标题输入时显示长度限制
当前56 字上限40 字
API 请求体 schema
请求体 Schema一次检查所有 API 字段
email✓ stringage✕ 应为 1–120role✓ user
失败返回 422 和字段级错误