尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Bearcat Model数据校验入门:约束与过滤器让脏数据无处遁形

Bearcat Model数据校验入门:约束与过滤器让脏数据无处遁形 Bearcat Model数据校验入门约束与过滤器让脏数据无处遁形【免费下载链接】bearcatpowered by enhanced javaScript objects项目地址: https://gitcode.com/gh_mirrors/be/bearcatBearcat 是一个由增强型 JavaScript 对象驱动的依赖注入框架其 Model 模块为数据模型提供了开箱即用的数据校验能力通过一行声明式的约束语法如notNull、size配合可插拔的过滤器即可在数据赋值的第一时间拦截脏数据。本文面向新手用最少的代码带你快速上手 Bearcat Model 数据校验。为什么需要数据校验在前后端应用中数据来自表单、接口、数据库等多种渠道undefined、超长字符串、类型错误的数值几乎是必然出现的。常见的痛点有手动判空繁琐每个字段都要写if (!value)遗漏一处就是线上事故校验逻辑散落各处业务代码里夹杂着大量if/else难以维护过滤与校验混在一起想自动补默认值 拦截非法值往往要写一堆胶水代码。Bearcat Model 的思路是在模型上声明规则赋值时自动执行。字段不合法时赋值会被直接拦截并返回错误脏数据根本无法进入对象内部。安装 Bearcat 框架项目支持 Node.js 后端与浏览器前端通过 npm 安装即可使用npm install bearcat完整的 Model 功能由lib/model/目录下的模块提供核心文件包括lib/model/modelDefinition.js—— 解析模型上声明的字段元信息类型、表名、前缀等lib/model/modelConstraint.js—— 描述字段与约束规则的绑定关系lib/model/modelFilter.js—— 字段过滤器负责在赋值时拦截/转换数据lib/model/constraints/—— 内置约束的目录按需自动加载30 秒上手声明约束并拦截脏数据下面用项目示例 examples/model_test/app/model/carModel.js 说明声明方式——每个字段用分号分隔的字符串描述规则var CarModel function() { this.$mid car; // 模型 id获取 Bean 时使用 this.$table ba_car; // 映射的 ORM 表名 this.id $primary;type:Number;; // 主键 this.num $type:Number;notNull; // 数字类型且不能为空 this.len $type:String;carSize(max5); // 字符串类型 自定义约束 this.place $balance;type:String;default:hangzhou; // 默认值 } module.exports CarModel;启动应用后即可通过bearcat.getModel(car)拿到模型实例赋值时约束自动生效示例见examples/model_test/app.jscar.$before(before).$after([transform]).$set(num, 100); // ✅ 正常赋值 car.$before([checkNum]).$set(num, aaa); // ❌ 类型错误赋值被拦截返回 Error car.$before().$set(len, aaaaa6); // ❌ 超过自定义约束长度被拦截可以看到非法值赋值后car.$get(num)拿到的仍是旧值脏数据没有进入模型。内置约束一览常用校验规则清单Bearcat 在lib/model/constraints/目录内置了 6 个约束文件名即约束名在字段声明中直接书写即可生效约束名说明典型场景源码位置notNull值不能为空必填字段lib/model/constraints/notNull.jsnull值必须为空仅用于禁止赋值的字段lib/model/constraints/null.jssize字符串长度区间校验支持min/max参数用户名长度、备注长度lib/model/constraints/size.jsmax数值上限校验支持max参数年龄、数量上限lib/model/constraints/max.jsmin数值下限校验支持min参数金额下限、库存下限lib/model/constraints/min.jspattern正则匹配校验支持regexp参数手机号、邮箱格式lib/model/constraints/pattern.js以size为例源码中定义了带参数字段max与min校验失败时返回格式化错误信息[SizeConstraint] key: ... length bigger than the max length ...方便直接定位问题字段。自定义约束用一行代码扩展校验规则内置约束不够用时可以按同样模式扩展。以示例中的carSize(max5)为例约束实现文件放在examples/model_test/app/constraint/目录如sizeConstraint.js、notNullConstraint.js约束构造函数中声明this.$cid carSize$cid就是字段里书写的约束名实现validate(key, value)方法校验通过则不返回不通过则return new Error(...)框架加载时会自动扫描约束目录并注册模型中直接写carSize(max5)即可。这种一个文件一个约束的设计加载逻辑见lib/model/constraints/index.js让约束天然可复用、可组合多个约束之间用分号串联即可叠加生效。过滤器拦截、转换脏数据的拦截器除了通过/拒绝Bearcat Model 还提供过滤器lib/model/modelFilter.js支持对单个字段或整个模型做更精细的处理按字段过滤filter(key, value)—— 只校验指定字段未命中定义时直接跳过全字段过滤filter()—— 遍历模型所有字段逐一执行field.filter(value)任何一个失败立即返回错误短路后续校验。在模型上还可以定义生命周期钩子方法参考examples/model_test/app/model/carModel.js方法触发时机用途before()赋值前执行返回要调用的校验方法名列表如[checkNum]transform()赋值后执行对数据做转换/修正如批量补默认值run()主动调用模型级联操作常用于聚合场景这套约束 过滤器 钩子的组合相当于给模型装了一道安检门先查证件before 校验再检查行李字段过滤器最后统一整理transform脏数据在入口处就被挡下。完整示例与测试目录导航想动手实践可以直接运行examples/model_test/app.js它演示了赋值、拦截、$packResultSet将结果集数据打包进模型并自动过滤的完整流程。相关配置见examples/model_test/context.json可重点查看的文件examples/model_test/app/model/carModel.js—— 约束声明与过滤钩子的完整示范examples/model_test/app/constraint/—— 自定义约束size、notNull的实现examples/model_test/app/data/mockResultSet.js—— 模拟数据库结果集数据test/model/—— Model 模块的单元测试覆盖属性、约束、过滤器、代理等行为常见问题Q约束校验失败后字段值会被污染吗不会。校验失败的赋值会被拦截$get取出的仍是上次合法值脏数据不会进入模型。Q约束和过滤器有什么区别约束是声明式的写在字段定义里负责通过/拒绝过滤器是方法式的定义在模型上可以做校验之外的数据转换和联动逻辑。Q浏览器环境能用吗可以。Bearcat 面向前端、Node.js 及混合应用设计同一份 POJO 代码无需修改即可在两端共享约束在浏览器端会自动跳过本地文件扫描逻辑。小结Bearcat Model 用一行声明式约束 可扩展过滤器的组合把数据校验从业务代码中解放出来字段上用分号串起type、notNull、size(max5)等规则声明即生效6 个内置约束覆盖必填、长度、上下限、正则等高频场景before/transform钩子与ModelFilter让拦截、转换、聚合各得其所校验失败立即短路返回 Error脏数据无处遁形。掌握这套机制后你只需要在模型上描述数据长什么样至于脏数据怎么挡交给 Bearcat 即可。【免费下载链接】bearcatpowered by enhanced javaScript objects项目地址: https://gitcode.com/gh_mirrors/be/bearcat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表