切换·Esc 返回

数据校验Validation

数据与账号
先检查用户提交的数据是否完整、格式是否正确

邮箱格式、标题长度和价格范围都需要数据校验。前端检查可以立即提示用户,但可能被绕过;后端仍要重新校验,并用明确错误说明哪一项不符合规则。

email✓ oil@example.com
age✕ 必须是 1–120
role✓ user

什么时候用

  • 在后端检查类型、必填、范围、长度和允许值
    一眼看清字段规则
    email必填 · 邮箱格式price数字 · 大于 0roleuser / admin
  • 返回字段级错误,让前端知道该在输入框旁提示什么
    错误要指向具体字段
    商品价格-3输入框下方价格必须大于 0
  • 先校验,再执行业务和数据库写入
    校验通过才写数据库
    收到输入规则检查写入数据库
  • 尽量使用框架的 schema 校验能力,规则集中在一处
    规则集中在一份 Schema
    email: 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 和字段级错误