Express-Validator 从 v5 迁移到 v6 的完整指南
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
前言
Express-Validator 是一个流行的 Express.js 中间件,用于验证和清理用户输入数据。从 v5 升级到 v6 版本带来了一些重大变化,本文将详细介绍迁移过程中需要注意的关键点,帮助开发者顺利完成升级。
环境要求变化
首先需要注意的是,v6 版本不再支持 Node.js 6。如果你的项目还在使用 Node.js 6,必须升级到 Node.js 8 或更高版本才能使用 express-validator v6。
从旧版 API 迁移到检查 API
应用设置变更
在 v5 版本中,我们通常这样初始化 express-validator:
const expressValidator = require('express-validator');
app.use(expressValidator());
在 v6 版本中,这种全局中间件的使用方式已被移除。你需要:
- 删除所有
app.use(expressValidator())
的调用 - 直接在路由处理程序中使用验证链
验证链的语法变化
v6 版本对验证和清理链的语法做了重大调整。以下是新旧版本对比:
| 旧版本(v5) | 新版本(v6) | 说明 | |------------|------------|------| | req.check(field)
| await check(field)
| 通用验证 | | req.checkBody(field)
| await body(field)
| 请求体验证 | | req.sanitize(field)
| await sanitize(field)
| 通用清理 | | req.sanitizeBody(field)
| await sanitizeBody(field)
| 请求体清理 |
重要变化:所有验证链现在都需要调用 .run(req)
方法,并且建议使用 await
关键字。
示例代码对比
// v5 版本
app.post('/contact', (req, res) => {
req.checkBody('email').isEmail();
req.sanitizeBody('message').escape().trim();
});
// v6 版本
const { body, sanitizeBody } = require('express-validator');
app.post('/contact', async (req, res) => {
await body('email').isEmail().run(req);
await sanitizeBody('message').escape().trim().run(req);
});
自定义验证器和清理器
v6 版本改变了自定义验证器和清理器的定义方式:
- 不再通过中间件选项全局注册
- 必须在每个验证链中通过
.custom()
或.customSanitizer()
方法定义
// v5 版本
app.use(expressValidator({
customValidators: { isEmailNotInUse },
customSanitizers: { muteOffensiveWords }
}));
// v6 版本
app.post('/signup', async (req, res) => {
await body('email').custom(isEmailNotInUse).run(req);
await sanitize('message').customSanitizer(muteOffensiveWords).run(req);
});
验证错误处理
错误处理方式也发生了变化:
| 旧版本(v5) | 新版本(v6) | 说明 | |------------|------------|------| | req.validationErrors()
| validationResult(req).array()
| 获取错误数组 | | req.validationErrors(true)
| validationResult(req).mapped()
| 获取映射的错误对象 | | req.getValidationResult()
| validationResult(req)
| 获取验证结果对象 |
如果需要自定义错误格式,可以这样处理:
const { validationResult } = require('express-validator');
const errorFormatter = (param, msg, value) => {
return `${param}: ${msg} (received ${value})`;
};
const myValidationResult = validationResult.withDefaults({
formatter: errorFormatter
});
// 使用方式
const errors = myValidationResult(req).array();
废弃的导入方式
v6 版本废弃了从特定路径导入的方式:
// 不再推荐
const { check } = require('express-validator/check');
const { sanitize } = require('express-validator/filter');
// 推荐方式
const { check, sanitize } = require('express-validator');
其他重大变更
除了上述主要变化外,v6 版本还包括:
- 移除了
expressValidator()
中间件 - 验证链现在默认是异步的
- 错误格式化的 API 发生了变化
- 一些内部实现细节的调整
迁移建议
- 逐步迁移:对于大型项目,建议逐个路由进行迁移
- 测试覆盖:确保有充分的测试覆盖,验证迁移后的行为
- 错误处理:特别注意错误处理逻辑的变化
- 异步处理:记住现在验证链默认是异步的,需要使用
await
总结
Express-Validator v6 带来了更现代化、更一致的 API 设计。虽然迁移过程需要一些手动工作,但新版本提供了更好的灵活性和可维护性。通过遵循本文的指南,你应该能够顺利完成从 v5 到 v6 的迁移。
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考