后端【免费下载链接】express-validatorAn express.js middleware for validator.js.项目地址https://gitcode.com/gh_mirrors/ex/express-validator点击查看免费下载校验链Validation Chain是 express-validator 中面向开发者最核心的 API无论是check()、body()、query()还是param()创建的校验器返回的都是一个可无限链式调用的校验链对象。本文基于 express-validator 5.2.0 版本的官方文档api-validation-chain.md系统讲解校验链的自定义扩展.custom()/.customSanitizer()、内置便捷校验器.exists()/.isArray()/.isString()以及链式修饰符.not()/.optional()/.withMessage()并结合仓库源码揭示其底层实现帮助你写出可维护、可复用的 Express 请求校验逻辑。校验链是什么由check()等入口函数如check()、body()、query()、param()创建的所有校验链都自动暴露 validator.js 提供的全部校验与清洗方法——只要项目当前依赖的 validator 版本足够新这些方法就都可以直接在链上调用。这意味着你在校验链上既可以做“校验”也可以做“清洗”。一个关键的语义是如果你把清洗器sanitizer和校验器validator组合使用那么被校验的值是清洗之后的值。例如先.trim()再去.isEmail()isEmail校验的是 trim 后的结果。另外需要注意校验链是可变的mutable。每次调用链上的方法都是在给同一条链添加更多的行为。正因如此当你想要在不同路由间复用某一段链的“基础”时强烈建议用工厂函数factory function每次返回新的链而不是直接共享同一个链实例否则后续调用会不断叠加到同一个链上造成校验行为互相污染。除了 validator.js 的全部方法之外校验链还额外提供了以下方法。自定义校验器.custom(validator)custom(validator(value, { req, location, path }) any)validator是自定义校验函数它接收两个参数value当前被校验字段的值元信息对象{ req, location, path }分别代表 Express 请求对象、字段所在位置如body、query、params以及字段路径。返回当前校验链实例。.custom()为当前校验链添加一个自定义校验器判定字段是否合法的方式如下校验函数返回PromisePromise resolve 表示通过reject 表示字段非法校验函数返回falsy 值如false、0、、undefined表示字段非法校验函数抛出 JavaScript 异常如throw new Error()表示字段非法此时异常消息会成为错误信息。典型的应用场景是“确认两次密码一致”app.post(/create-user, [ check(password).exists(), check(passwordConfirmation, passwordConfirmation field must have the same value as the password field) .exists() .custom((value, { req }) value req.body.password) ], loginHandler);从源码结构看.custom()在 src/chain/validators-impl.ts 中实现为把CustomValidation这一上下文项加入ContextBuilder而 src/context-items/custom-validation.ts 展示了其执行细节先await校验函数结果若结果为 falsy、Promise 被 reject或函数抛错都会通过context.addError()记录字段错误——这也解释了为什么throw new Error()的消息能直接进入错误报告。自定义清洗器.customSanitizer(sanitizer)customSanitizer(sanitizer(value, { req, location, path }) any).customSanitizer()与 清洗链Sanitization Chain的.customSanitizer行为一致用于把自定义清洗函数挂到校验链上函数的返回值会成为字段的新值。底层实现位于 src/chain/sanitizers-impl.ts它把Sanitization(sanitizer, true)加入构建器运行时 src/context-runner-impl.ts 会在每个上下文项执行完毕后用清洗后的新值通过_.set()回写到req上——这就是“先清洗后校验、清洗结果同步回请求对象”的机制来源。内置便捷校验器.exists()exists() ValidationChain返回当前校验链实例。为当前字段添加“存在性”校验字段的值不能是undefined其他任何值包括null、空字符串、0等都算作存在。源码实现见 src/chain/validators-impl.ts其核心判断是value ! undefined。这在“字段必须出现在请求里”的场景例如配合.custom()前先确认字段存在非常有用。.isArray()isArray() ValidationChain返回当前校验链实例。添加一个校验器检查字段值是否为数组。从 src/chain/validators-impl.ts 的源码可以确认它就是Array.isArray(value)的自定义校验封装适用于请求体中数组字段如标签列表的类型校验。.isString()isString() ValidationChain返回当前校验链实例。添加一个校验器检查字段值是否为字符串底层等价于typeof value string见 src/chain/validators-impl.ts。链式修饰符.not()not() ValidationChain返回当前校验链实例。对下一个校验器的结果取反。注意它的作用范围是紧接着的下一个校验器check(weekday).not().isIn([sunday, saturday])上述代码表示weekday的值不能是sunday或saturday。源码层面 src/chain/validators-impl.ts 只是置位一个negateNext标志并在下一次addItem时重置第 14-21 行从而保证取反只作用于紧随其后的校验器。.optional(options)optional(options?) ValidationChainoptions可选用于定制 optional 行为的配置对象。返回当前校验链实例。把当前校验链标记为“可选”。这对“非业务必需字段”非常实用如果客户端没有提供这些字段就不会触发校验失败。默认情况下值为undefined的字段会被跳过校验你可以传入配置对象自定义行为选项类型含义nullableboolean若为true值为null的字段也被视为可选checkFalsyboolean若为true值为 falsy如、0、false、null的字段也被视为可选// 只有 undefined 的字段会被跳过校验默认行为 check(bio).optional().isLength({ max: 200 }) // null 与 undefined 都被跳过 check(avatar).optional({ nullable: true }).isURL() // 空串、0、false、null、undefined 都被跳过 check(nickname).optional({ checkFalsy: true }).isLength({ min: 3 })从源码看可选性最终落在Context的optional属性上类型定义见 src/context.ts而 src/context.ts 的getData({ requiredOnly: true })会在执行校验前根据 optional 配置过滤掉应被跳过的字段实例从而在根上避免这些字段参与校验。.withMessage(message)withMessage(message) ValidationChainmessage为前一个校验器设置的错误消息。返回当前校验链实例。为链上“前一个”校验器设置错误消息。需要特别注意它的优先级高于自定义校验器抛出的异常——即如果你在.custom()之后调用.withMessage()即使自定义校验器throw new Error(...)最终错误消息也会被.withMessage()指定的消息覆盖源码见 src/chain/validators-impl.ts 的lastValidator.message赋值逻辑。check(username) .exists() .withMessage(username 字段不能为空)关于动态错误消息根据字段值生成不同文案请参考官方文档 Dynamic Messages动态消息。如何拿到校验结果校验链本身是可执行的由check()函数 创建的链可直接作为 Express 路由中间件使用校验会自动运行也可将其作为oneOf()等高级 API 的参数或通过validationResult()收集校验错误。校验失败的具体错误结构与格式化方式请参考 Validation Result API。小结express-validator 5.2.0 的校验链 API 将 validator.js 的上百个校验/清洗方法与几个关键的链式增强方法统一到了一套可读性极高的 DSL 上自定义能力.custom()处理同步/异步/抛异常三种失败形态.customSanitizer()自由改写字段值便捷校验.exists()、.isArray()、.isString()覆盖了最高频的类型与存在性检查链式控制.not()精准取反下一个校验器.optional()按undefined/null/falsy 灵活跳过非必填字段.withMessage()精确控制每一条校验的错误文案。由于链是可变的复用公共校验逻辑时请务必使用工厂函数生成新链组合清洗器与校验器时请牢记“先清洗、后校验”的执行顺序。想要深入阅读实现细节可以继续查看 src/chain/validators-impl.ts、src/chain/sanitizers-impl.ts、src/context-items/custom-validation.ts 与 src/context-runner-impl.ts。赞分享后端【免费下载链接】express-validatorAn express.js middleware for validator.js.项目地址https://gitcode.com/gh_mirrors/ex/express-validator点击查看免费下载相关推荐express-validator 校验链Validation ChainAPI 详解从标准验证器到自定义验证与命令式执行express validator 校验链Validation ChainAPI 详解从标准验证器到自定义验证与命令式执行 本文以 express val后端express-validator Validation Chain API 完全指南构建可复用的字段校验链express validator Validation Chain API 完全指南构建可复用的字段校验链 本文以 express validator 6.后端AMD显卡AI创作的终极解决方案ComfyUI-Zluda深度解析与实践指南AMD显卡AI创作的终极解决方案ComfyUI Zluda深度解析与实践指南 还在为AMD显卡无法充分发挥AI创作潜力而困扰吗ComfyUI Zluda正是人工智能大模型媒体生成计算机视觉后端上一篇Autoresearch Skill 2.2.2 全解Claude Code 中的自主目标导向迭代编排协议下一篇GetQzonehistory如何把QQ空间历史说说全部导出成Excel表格完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考