Proxy构建数据模型验证器的核心是将校验规则从操作中抽离,通过schema集中配置字段约束,set拦截自动转换与校验,暴露isValid、errors等接口,业务代码无感知且零侵入。

用 Proxy 构建数据模型验证器,关键在于把校验规则从对象操作中抽离出来,让业务代码只关心“要存什么”,不操心“能不能存”。验证逻辑集中定义、统一管理,修改规则不影响已有字段赋值写法。
定义可复用的验证规则配置
把每个字段的约束写成结构化配置,比如类型、范围、必填、正则等,避免在 set 里硬编码判断:
- 用 schema 对象组织规则,键为字段名,值为校验项(type、required、min、pattern、message)
- 支持基础类型检查(
string、number、email),也支持自定义函数,例如:validate: (v) => v.length > 2 - 错误消息可单独配置,便于多语言或 UI 展示,不混在逻辑里
用 Proxy.set 拦截并执行验证
handler 的 set 方法是核心入口,它接收赋值动作并决定是否放行:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 先查 schema 是否存在该字段配置;不存在就跳过验证,保持兼容性
- 对值做类型转换(如
Number(value))再校验,避免字符串数字被误判 - 逐条运行规则:空值检查 → 类型检查 → 范围/正则检查;任一失败就记录错误,不写入 target
- 校验通过才调用 Reflect.set(target, property, value),保证 this 上下文正确
暴露状态与控制接口
验证器不只是拦截,还要让外部能感知和干预:
- 提供 isValid() 返回整体合法性(所有字段无 error)
- 暴露 errors getter,返回形如
{ email: '邮箱格式错误' }的对象,供表单组件直接绑定 - 支持 validate(field?) 手动触发单个或全部字段重验(适合失焦、提交前兜底)
- 添加 reset() 清空值与错误,方便表单重用
保持业务层干净无侵入
使用时,业务代码完全不感知验证存在:
- 初始化:
const user = new ValidatedModel({ name: '', age: '' }, schema) - 赋值:
user.name = '李四'; user.age = '25';—— 自动转数字并校验 - 取状态:
user.isValid()或user.errors.email,无需手动调校验函数 - 后续扩展字段或改规则,只需更新 schema,不碰业务逻辑

















