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),仅供参考

相关新闻

Tauri 2 + React 桌面端开发:从 CLI 到 GUI 的进化

Tauri 2 + React 桌面端开发:从 CLI 到 GUI 的进化

摘要:终端界面虽然高效,但不是所有开发者都喜欢黑屏白字。cc-haha 的桌面端基于 Tauri 2 和 React 构建,将 AI 编程助手的能力封装到一个现代化的图形界面中。本文深入解析三层架构设计、WebSocket 实时通信、12 个 Zustand Store 的状态管理…

2026/10/11 10:59:15 阅读更多 →
AIO Sandbox 实战集成指南:终端、浏览器自动化与 AI Agent 全场景示例

AIO Sandbox 实战集成指南:终端、浏览器自动化与 AI Agent 全场景示例

AI Agent后端MCP 服务浏览器控制Agent 评测 【免费下载链接】sandbox All-in-One Sandbox for AI Agents that combines Browser, Shell, File, MCP and VSCode Server in a single Docker container. 项目地址: https://gitcode.com/gh_mirrors/sandbox103/sandbox…

2026/10/11 11:01:13 阅读更多 →
OWASP Top 10 2017 开发者下一步行动指南:建立可复用的安全流程与标准安全控制

OWASP Top 10 2017 开发者下一步行动指南:建立可复用的安全流程与标准安全控制

应用安全 【免费下载链接】Top10 Official OWASP Top 10 Document Repository 项目地址: https://gitcode.com/gh_mirrors/top/Top10 点击查看 免费下载 本指南以 OWASP Top 10 官方文档仓库中的《开发者的下一步》(2017/ja/0xb0-next-devs.md 及英文版…

2026/10/11 13:20:35 阅读更多 →

最新新闻

华为无线解决方案报告书:从设计到交付的WLAN避坑指南

华为无线解决方案报告书:从设计到交付的WLAN避坑指南

简介:这是一份华为无线解决方案报告书,以某集团无线覆盖项目为背景,系统讲解无线局域网从设计到落地的完整思路,适合网络工程师、方案架构师及高校通信相关专业学生参考。报告重点涵盖网络设计原则、无线信号质量分析、总体架构、…

2026/10/11 15:03:52 阅读更多 →
从零实现 C++ AI 大模型接入 SDK(九):LLMManager 统一模型管理与请求路由

从零实现 C++ AI 大模型接入 SDK(九):LLMManager 统一模型管理与请求路由

目录 前言 一、Provider 已经统一,为什么还需要 LLMManager 1.1 统一接口不等于统一管理 1.2 LLMManager 的职责边界 二、先看 LLMManager 的接口和内部结构 2.1 头文件提供哪些能力 2.2 为什么需要两张 map 三、注册 Provider:为什么使用 uniqu…

2026/10/11 15:03:52 阅读更多 →
鸿蒙化Flutter插件适配实战:从MissingPlugin到链接预览卡片

鸿蒙化Flutter插件适配实战:从MissingPlugin到链接预览卡片

前阵子接到一个需求:鸿蒙版应用里,聊天窗口和内容信息流都要支持粘贴链接后自动生成富媒体摘要卡片。Flutter 侧主工程之前用了 simple_link_preview 这个三方库,在 Android 和 iOS 上跑得很顺,换到鸿蒙后却直接报 MissingPluginE…

2026/10/11 15:03:52 阅读更多 →
鸿蒙 Flutter 适配 lorem_gen:纯 Dart 库移植实战与 UI 效率提升

鸿蒙 Flutter 适配 lorem_gen:纯 Dart 库移植实战与 UI 效率提升

鸿蒙上用 Flutter 做界面,最折腾我的往往不是业务逻辑,反而是那些不起眼的填充数据。界面都排好了,但页面里全是空壳子和“TODO”,截图给产品看,对方回一句“这页面还没做完吧”,直接噎住。我前阵子就因为这…

2026/10/11 15:03:52 阅读更多 →
FIFO页面置换算法详解:从缺页计算到Belady异常

FIFO页面置换算法详解:从缺页计算到Belady异常

2009年408统考的第26题,操作系统,内存管理。这道题我在复习时第一次做就栽了——不是不会算,而是把“缺页次数”和“置换次数”混在了一起,最后对答案时发现整道题的思路就偏了。后来我拿格子法在草稿纸上重新推了一遍&#xff0c…

2026/10/11 15:03:52 阅读更多 →
Oracle 第二模型审查实战指南:用 agent-scripts 打包仓库上下文并交给 GPT-5.5 Pro 等外部模型

Oracle 第二模型审查实战指南:用 agent-scripts 打包仓库上下文并交给 GPT-5.5 Pro 等外部模型

【免费下载链接】agent-scripts Scripts for agents, shared between my repositories. 项目地址: https://gitcode.com/gh_mirrors/ag/agent-scripts 点击查看 免费下载 本文面向在 agent-scripts 仓库(AGENTS.MD)管理的多 Agent 工作流中运…

2026/10/11 15:02:52 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →