express-validator 校验链(Validation Chain)API 详解:自定义校验器、可选字段与链式修饰符
后端【免费下载链接】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),仅供参考

相关新闻

64位token:结构化数据解析的内存与性能革命

64位token:结构化数据解析的内存与性能革命

1. 项目概述:为什么一个“64位token”能重构结构化数据处理的底层逻辑?最近在某实验室做数据管道优化时,团队被一个看似简单却顽固的问题卡了三周:日均处理2.3亿条JSON日志,单节点内存峰值总在凌晨2点飙升到92%&#x…

2026/10/10 5:47:41 阅读更多 →
learnxinyminutes-docs 中文版 Git 入门指南:从版本控制原理到日常命令实战

learnxinyminutes-docs 中文版 Git 入门指南:从版本控制原理到日常命令实战

文档教程 【免费下载链接】learnxinyminutes-docs Code documentation written as code! How novel and totally my idea! 项目地址: https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs 点击查看 免费下载 本篇技术指南以 zh-cn/git.md 为核心骨架&#xf…

2026/10/10 5:47:41 阅读更多 →
CodePilot 分支预览包发布指南:从版本单源到 packaged 运行时验证的完整闭环

CodePilot 分支预览包发布指南:从版本单源到 packaged 运行时验证的完整闭环

人工智能AI 应用AI Agent交互助手MCP Clients本地部署 【免费下载链接】CodePilot A multi-model AI agent desktop client — connect any AI provider, extend with MCP & skills, control from your phone. Built with Electron Next.js. 项目地址: https:/…

2026/10/10 5:47:41 阅读更多 →

最新新闻

VmwareHardenedLoader实战:隐藏虚拟机指纹的加载器完全指南

VmwareHardenedLoader实战:隐藏虚拟机指纹的加载器完全指南

简介:面向逆向分析与安全测试场景的VMware加固工具,通过内核驱动在运行时修补SystemFirmwareTable,清除“VMware”、“Virtual”等可检测特征,使虚拟机客户机规避VMProtect 3.2、Safengine及Themida的反虚拟机机制。当前仅支持Win…

2026/10/10 6:29:55 阅读更多 →
CPU核心概念解读:从核心、缓存到功耗墙,彻底参透处理器性能

CPU核心概念解读:从核心、缓存到功耗墙,彻底参透处理器性能

CPU的核心概念,听起来像一门玄学,网上测评满天飞,各种参数看得人眼花,但真要自己攒机、调优或者写代码优化性能的时候,又觉得那些概念隔着什么东西。做了这么多年开发和高性能相关的折腾,我最大的体会是&am…

2026/10/10 6:29:55 阅读更多 →
下载提速的底层逻辑:从在线解析工具到直链的正确用法

下载提速的底层逻辑:从在线解析工具到直链的正确用法

先说个很多人没想透的事:迅雷这类下载工具,速度上不去的时候,绝大多数原因不是“软件坏掉了”,也不是非要开会员不可,而是你根本没把下载路径上的几个环节挨个打通。标题里提到的“在线解析工具”,更像是在…

2026/10/10 6:29:55 阅读更多 →
零改造升维:单路视频直接可计算阵地态势底座技术方案

零改造升维:单路视频直接可计算阵地态势底座技术方案

摘要针对当前阵地态势感知领域普遍存在的硬件改造成本高、设备部署复杂、场景适配性差、数据不可计算、态势虚实脱节等行业痛点,本文基于耿文海团队原创像素升维理论,提出零改造升维、单路视频直接可计算的阵地态势底座全新技术体系。区别于传统态势系统…

2026/10/10 6:29:55 阅读更多 →
MediaPipe双模疲劳与姿势检测系统实战指南

MediaPipe双模疲劳与姿势检测系统实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 6:29:55 阅读更多 →
JSP+SQL Server学生信息管理系统开发实战:从环境搭建到避坑指南

JSP+SQL Server学生信息管理系统开发实战:从环境搭建到避坑指南

简介:这是一套基于JSP与SQL Server的学生信息管理系统设计与实现项目,采用B/S架构,适合Java Web课程设计、毕业设计及初阶开发者学习参考。资源内含项目全套源码与完整文档,源码已经测试校正可正常运行,配套说明文档与…

2026/10/10 6:28:55 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →