proxy构建通用数据验证框架的核心是解耦校验规则与赋值动作,通过set拦截自动触发集中管理的schema校验,支持类型转换、多级验证链、错误收集及isvalid()等状态接口。

用 Proxy 构建通用数据验证框架,核心是把校验规则从赋值动作中解耦出来,让业务代码只管“设什么”,不管“能不能设”。它不修改原始对象结构,也不要求你在每次赋值前手动调用 validate(),而是靠 set 拦截自动触发检查,同时支持灵活配置、错误收集和状态反馈。
定义可复用的字段规则 schema
验证逻辑必须集中管理,不能散落在 set 里硬编码。推荐用一个 plain object 描述每个字段的约束:
-
type:基础类型(
string、number、email、date),支持自动转换(如"18"→18) -
required:布尔值,控制是否允许空值(
null、undefined、空字符串、空数组等) - min / max:数值范围或字符串长度限制
-
pattern:正则表达式,比如
/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i -
validate:自定义函数,接收值并返回
true或错误消息字符串 - message:失败时的提示文本,便于多语言或 UI 绑定
用 set 拦截实现自动校验与安全写入
Proxy handler 的 set 是执行校验的主入口。关键点在于:校验失败时不写入,但也不一定抛错——更实用的做法是记录错误、保持对象可用性:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 先查 schema 是否含该字段;若无配置,直接放行(兼容动态属性或遗留字段)
- 对值做预处理:如
type: 'number'时尝试Number(value),失败则按 NaN 处理 - 按顺序执行校验链:required → type → min/max → pattern → validate;任一环节失败就存入 errors 对象,不调用
Reflect.set - 仅当全部通过,才执行
Reflect.set(target, prop, finalValue),确保 this 和原型链行为不变
暴露清晰的状态接口供业务使用
验证器不是黑盒,要让表单、UI 层能感知和响应状态。建议提供以下方法/属性:
-
isValid():遍历所有字段的 errors,返回
Object.keys(errors).length === 0 -
errors(getter):返回形如
{ email: '邮箱格式错误', age: '年龄必须在 0–120 之间' }的对象,可直接绑定到 Vue/React 表单控件 - validate(field?):手动触发重验,传字段名则只验单个,不传则全量校验(适合提交前兜底)
- reset():清空 target 所有值(还原初始状态)并清空 errors,方便表单复用
封装成类,保持 Proxy 内部职责单一
不要把 schema、errors、方法都塞进 handler 对象。推荐用 class 包装:
- 构造时接收初始数据和 schema,内部用
WeakMap关联两者,避免内存泄漏 - errors 存在实例私有属性中(如
#errors),不污染 target - Proxy handler 只负责拦截和调用校验逻辑,具体规则判断、消息组装由 class 方法完成
- 对外暴露干净 API:
const form = new ValidatedModel({name: ''}, schema); form.name = '张三'; console.log(form.isValid());










