Express-Validator 从 v5 迁移到 v6 的完整指南
前言
Express-Validator 是一个流行的 Express.js 中间件,用于验证和清理用户输入数据。从 v5 升级到 v6 版本带来了一些重要的变化,本文将详细介绍迁移过程中需要注意的关键点,帮助开发者顺利完成升级。
环境要求变化
首先需要注意的是,v6 版本不再支持 Node.js 6。如果你的项目还在使用 Node.js 6,需要先升级到 Node.js 8 或更高版本。
从旧版 API 迁移到检查 API
如果你的项目使用的是旧版 API,需要进行以下迁移步骤:
1. Express 应用配置变更
在 v5 中,我们通常这样初始化 express-validator:
const expressValidator = require('express-validator');
app.use(expressValidator());
在 v6 中,这种全局中间件的方式已被移除,你需要删除这行代码。
2. 路由处理器中的验证/清理链
v6 引入了全新的 API 设计,验证和清理链的写法有较大变化。以下是新旧 API 的对比:
| 旧版 API | 新版 API | |-----------------------------|--------------------------| | 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)
方法调用。
示例变更:
// 旧版
req.checkBody('email').isEmail();
req.sanitizeBody('message').escape().trim();
// 新版
await body('email').isEmail().run(req);
await sanitizeBody('message').escape().trim().run(req);
3. 自定义验证器和清理器
在 v5 中,自定义验证器和清理器是通过中间件选项全局注册的。v6 中改为在每个验证链中单独定义:
// 旧版
app.use(expressValidator({
customValidators: { isEmailNotInUse },
customSanitizers: { muteOffensiveWords }
}));
// 新版
await body('email').custom(isEmailNotInUse).run(req);
await sanitize('message').customSanitizer(muteOffensiveWords).run(req);
4. 验证错误处理
错误处理的 API 也有显著变化:
| 旧版 API | 新版 API | |----------------------------------------|----------------------------------| | req.validationErrors()
| validationResult(req).array()
| | req.validationErrors(true)
| validationResult(req).mapped()
| | req.getValidationResult()
| validationResult(req)
|
如果你在 v5 中使用了 errorFormatter
,可以在 v6 中这样处理:
const { validationResult } = require('express-validator');
const myValidationResult = validationResult.withDefaults({
formatter: errorFormatter
});
const errors = myValidationResult(req).array();
废弃的导入方式
v6 废弃了从 express-validator/check
和 express-validator/filter
导入的方式。现在所有功能都可以直接从 express-validator
导入:
// 不再推荐
const { check } = require('express-validator/check');
const { sanitize } = require('express-validator/filter');
// 推荐方式
const { check, sanitize } = require('express-validator');
其他重大变更
除了上述主要变化外,v6 版本还包含一些其他重要变更:
- Promise 支持:许多 API 现在返回 Promise,需要使用
await
或.then()
处理 - 性能优化:内部实现进行了重构,提高了性能
- 类型定义改进:TypeScript 支持得到增强
迁移建议
- 逐步迁移:大型项目可以逐个路由进行迁移,而不是一次性全部修改
- 测试覆盖:确保有足够的测试覆盖验证逻辑,迁移后立即运行测试
- 错误处理:特别注意错误处理逻辑的变化,这是常见的迁移问题点
- 异步处理:注意新的异步 API 设计,确保正确处理 Promise
总结
Express-Validator v6 带来了更现代、更一致的 API 设计,虽然迁移需要一些工作,但新版本提供了更好的性能和更清晰的代码结构。按照本文指南,你应该能够顺利完成从 v5 到 v6 的迁移。如果在迁移过程中遇到特定问题,建议查阅详细的发布说明以获取更多信息。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考