express-validator 入门实战:用 Express 中间件完成请求参数校验与错误报告

📅 发布时间:2026/10/10 8:43:45
express-validator 入门实战:用 Express 中间件完成请求参数校验与错误报告
后端【免费下载链接】express-validatorAn express.js middleware for validator.js.项目地址https://gitcode.com/gh_mirrors/ex/express-validator点击查看免费下载express-validator 是一组面向 Express 的中间件集合它在 validator.js 提供的校验器validator与净化器sanitizer之上为你的路由添加声明式的字段校验能力。本文将以 5.2.0 版本文档的 Getting Started 指南为主体结合仓库源码带你从安装起步一步步把一段不设防的 Express 路由改造成带check()校验链与validationResult()错误收集的完整示例并理解校验链底层如何串行执行、错误对象如何结构化输出为后续进阶功能净化、自定义校验器、自定义错误消息、通配符、Schema 校验打下基础。express-validator 是什么express-validator 本质上是一个薄封装层它把 validator.js 的校验与净化函数包装成Express 中间件Middleware让你能够像声明路由一样声明某个字段必须满足哪些规则。官方对其定位的描述是express-validator is a set of express.js middlewares that wraps validator.js validator and sanitizer functions.在阅读本指南前官方文档建议你先具备 express.js 模块的基础知识中间件、路由、req/res的基本用法因为校验中间件需要嵌入到 Express 的路由处理流程中才能发挥作用。当前仓库即 express-validator 的完整源码工程package.json 中版本号为 7.3.2核心实现位于src/目录通过 TypeScript 编写并编译输出到lib/。本文讲解的入门流程在 5.2.0 及后续版本中一脉相承check()构建校验链、校验链作为中间件挂载、validationResult()汇总错误。安装与运行环境使用 npm 安装即可5.2.0 文档要求 Node.js 6 或更新版本npm install --save express-validator需要说明的是随着项目演进当前仓库 package.json 的engines字段已要求node 14.0.0并且依赖了validator ~13.x与lodash。如果你使用较新的 Node 版本直接npm install express-validator后即可开始下面的示例。安装完成后项目会同时提供编译产物与类型声明main: ./lib/index.js、types: ./lib/index.d.tsTypeScript 用户开箱即用。基础指南从无校验路由到带校验路由第一步先写一个不设防的路由入门示例从创建用户接口开始。下面的路由直接读取req.body并落库完全没有对输入做任何检查const express require(express); const app express(); app.use(express.json()); app.post(/user, (req, res) { User.create({ username: req.body.username, password: req.body.password }).then(user res.json(user)); });这段代码的问题很明显username可以是任意内容password可以是任意长度任何畸形请求都会直接进入数据库逻辑。接下来我们引入 express-validator 来补上这道防线。第二步用 check() 声明校验规则导入check与validationResult5.2.0 时代从express-validator/check子模块导入当前仓库版本则统一从express-validator根入口导入src/index.ts会导出check、body、validationResult等全部 API// ...rest of the initial code omitted for simplicity. const { check, validationResult } require(express-validator/check); app.post(/user, [ // username must be an email check(username).isEmail(), // password must be at least 5 chars long check(password).isLength({ min: 5 }) ], (req, res) { // Finds the validation errors in this request and wraps them in an object with handy functions const errors validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } User.create({ username: req.body.username, password: req.body.password }).then(user res.json(user)); });这里发生了什么check(username).isEmail()创建了一条针对username字段的校验链Validation Chain并追加了isEmail()校验规则check(password).isLength({ min: 5 })同样为password创建校验链要求长度至少为 5两条校验链组成数组作为中间件数组传给app.post(/user, ...)在进入业务处理函数之前被执行业务处理函数中通过validationResult(req)取出本次请求的所有校验错误errors.isEmpty()判断是否通过不通过则返回 HTTP 400 与错误数组。从源码看check()的实现位于 src/middlewares/check.ts它用ContextBuilder记录字段名、请求位置与默认消息构建ContextRunnerImpl运行器再通过Object.assign把运行器、校验器ValidatorsImpl、净化器SanitizersImpl与上下文处理方法绑定到同一个中间件函数上——这就是为什么一条校验链既能当中间件使用又能链式调用.isEmail()、.isLength()、.trim()等方法的原因。测试 src/middlewares/check.spec.ts 也验证了校验链同时具备 validator、sanitizer、context-handler 与 context-runner 四类方法。第三步看看校验失败时的响应Voila!现在任何包含非法username或password字段的请求都会被拦截服务器会返回如下结构的 JSON{ errors: [{ location: body, msg: Invalid value, param: username }] }这个错误对象是字段级校验错误的经典结构含义为location出错字段所在的请求位置这里是body还可能是cookies、headers、params、querymsg错误消息。当某条校验规则没有显式指定消息时默认就是Invalid valueparam出错的字段名。对照当前仓库 src/base.ts 中定义的FieldValidationError类型可以看到这一结构在后续版本中被细化为type: fieldlocationpathvaluemsg的联合类型字段名param演化为path并且错误类型扩展出了alternativeoneOf()全部备选失败、unknown_fieldscheckExact()发现未知字段等种类。但入门阶段你只需要理解每个校验错误都携带位置 字段 消息三元信息足够客户端精确提示。第四步校验通过后的正常流程当username与password都合法时validationResult(req).isEmpty()返回true代码继续执行原有的User.create(...)逻辑整个流程与最初的版本完全一致——express-validator 只在请求进入业务逻辑之前拦截非法输入不改变合法的业务行为。check() 校验链的工作原理源码视角入门示例里最核心的 API 是check()。虽然入门指南只展示了最简用法但理解其机制有助于你写出正确的校验代码。校验的五个请求位置check()默认会在以下所有请求对象中查找目标字段从 src/middlewares/validation-chain-builders.ts 可见其默认 locations 为[body, cookies, headers, params, query]req.bodyreq.cookiesreq.headersreq.paramsreq.query如果某个字段在多个位置同时出现那么每一处取值都必须通过校验。例如请求同时携带query.id与body.idcheck(id)会对两处值分别校验。定位字段通配符与路径展开字段选择逻辑在 src/field-selection.ts 中实现selectFields会把字段 × 位置展开成一组FieldInstance含location、path、value并自动去重。它还支持*、**通配符用于嵌套对象与数组例如check(products.*.price)这是入门后进阶Wildcards 特性的地基。另外注意对于headers位置字段名会被统一转为小写后再匹配。校验链的执行顺序check()构建出的校验链在作为中间件执行时内部由 src/chain/context-runner-impl.ts 的run()驱动关键行为包括同一字段的校验规则串行执行校验链上的.isEmail()、.isLength()等规则按声明顺序逐个运行后一个规则看到的是前一个规则运行后的值净化器修改值后后续校验基于新值不同字段并行执行如果一条校验链同时覆盖多个字段这些字段的校验互不阻塞值回写净化器sanitizer修改字段值后运行器会把新值写回req对应位置_.set(req[location], path, newValue)这就是.trim()等净化方法能原地修正输入的原理上下文收集每个中间件运行后其校验上下文含错误列表被挂到请求的express-validator#contexts键上见 src/base.ts 的contextsKeyvalidationResult(req)正是从这里汇总所有中间件的错误。字段缺省时的行为入门示例只展示了普通字段校验。若调用check()时不传任何字段则校验整个请求位置通常仅对req.body有意义即 Whole Body Validation 特性。本指南不展开详见后续的进阶文档。validationResult统一收集与读取校验错误validationResult(req)接收 Express 的请求对象把所有中间件产生的校验错误抽取出来包装成一个validation result 对象。其实现位于 src/validation-result.ts核心逻辑是从请求的 contexts 中flatMap出所有错误交给Result类实例管理。Result实例提供了几个实用的方法isEmpty()是否没有错误入门示例用它作为继续执行业务逻辑的开关array()把错误转换为数组默认返回全部错误传入{ onlyFirstError: true }则每个字段只保留第一条错误入门示例用errors.array()直接序列化进响应mapped()把错误转换为字段名 → 错误的对象形式便于按字段快速取用throw()若存在校验错误则直接抛出异常适合在try/catch中配合统一错误处理中间件使用formatWith(fn)返回一个使用自定义格式化函数的新Result实例用于定制错误输出结构。入门示例中的res.status(400).json({ errors: errors.array() })即为最典型的用法isEmpty()判断 array()输出。校验规则从哪里来示例中的isEmail()、isLength({ min: 5 })并非 express-validator 自己实现而是直接来自 validator.js 的校验器集合。express-validator 把 validator.js 中所有可用的校验器及其选项以同名方法的形式暴露在校验链上。当你需要更多内置规则如isInt、isUUID、isIn等时可直接在链式调用中查阅这些方法及其选项。仓库的 declarations/validator.d.ts 即为 validator.js 的类型声明可作为方法清单参考。接下来可以深入的方向入门指南到此已经覆盖了安装 → 声明校验 → 收集错误 → 返回 400的完整闭环。官方文档在此基础上推荐了五个进阶方向均可在本仓库website/versioned_docs/version-5.2.0/目录下找到对应文档Sanitization净化使用.trim()、.escape()等方法在写入数据库前清理输入防止脏数据与 XSSCustom validators/sanitizers自定义校验器与净化器当内置规则不够用时编写自己的校验逻辑Custom error messages自定义错误消息把默认的Invalid value替换为对用户友好的提示Wildcards通配符校验嵌套对象与数组中的字段Schema validationSchema 校验用声明式 Schema 对象一次性描述整张表单的校验规则。在开始这些进阶话题之前建议你先亲手把上面的/user路由跑通发起一个带非法username或过短password的 POST 请求观察 400 响应中的errors数组结构再通过合法请求确认User.create正常执行。一旦你掌握了校验链 validationResult这对组合express-validator 的其余特性都只是在这条主线上叠加更多规则与更灵活的错误处理而已。赞分享后端【免费下载链接】express-validatorAn express.js middleware for validator.js.项目地址https://gitcode.com/gh_mirrors/ex/express-validator点击查看免费下载相关推荐buku 项目 Bukuserver 多语言国际化Flask-Babel 翻译工作流与 CLI 实战指南buku 项目 Bukuserver 多语言国际化Flask Babel 翻译工作流与 CLI 实战指南 导读 本文围绕 buku 仓库中 bukuserve后端express-validator 快速入门在 Express 应用中完成校验、错误处理与输入净化express validator 快速入门在 Express 应用中完成校验、错误处理与输入净化 本篇指南以 express validator 官方入门文后端express-validator 快速上手为 Express 请求接入 validator.js 校验与清洗中间件express validator 快速上手为 Express 请求接入 validator.js 校验与清洗中间件 express validator 是一后端上一篇BilibiliDown终极指南3步轻松下载B站高清视频与音频下一篇中国行政区划数据标准化难题与五级联动数据架构解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考