Express-Validator 从 v5 迁移到 v6 的完整指南

Express-Validator 从 v5 迁移到 v6 的完整指南

express-validator 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 版本中,这种全局中间件的使用方式已被移除。你需要:

  1. 删除所有 app.use(expressValidator()) 的调用
  2. 直接在路由处理程序中使用验证链

验证链的语法变化

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 版本改变了自定义验证器和清理器的定义方式:

  1. 不再通过中间件选项全局注册
  2. 必须在每个验证链中通过 .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 版本还包括:

  1. 移除了 expressValidator() 中间件
  2. 验证链现在默认是异步的
  3. 错误格式化的 API 发生了变化
  4. 一些内部实现细节的调整

迁移建议

  1. 逐步迁移:对于大型项目,建议逐个路由进行迁移
  2. 测试覆盖:确保有充分的测试覆盖,验证迁移后的行为
  3. 错误处理:特别注意错误处理逻辑的变化
  4. 异步处理:记住现在验证链默认是异步的,需要使用 await

总结

Express-Validator v6 带来了更现代化、更一致的 API 设计。虽然迁移过程需要一些手动工作,但新版本提供了更好的灵活性和可维护性。通过遵循本文的指南,你应该能够顺利完成从 v5 到 v6 的迁移。

express-validator express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邓娉靓Melinda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值