express-validator 6.15.0 版本验证链(Validation Chain)API详解

express-validator 6.15.0 版本验证链(Validation Chain)API详解

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

express-validator 是一个强大的 Express 中间件,用于验证和清理请求数据。其中验证链(Validation Chain)是其核心功能之一,本文将深入解析验证链的API及其使用方法。

验证链基础概念

验证链本质上是一个中间件,应该传递给 Express 的路由处理程序。它的主要特点包括:

  1. 链式调用:可以在一个链上添加多个验证器和清理器
  2. 顺序执行:验证器和清理器按照添加顺序执行
  3. 可变性:每次调用方法都会向同一个链添加新行为
// 基础示例
app.post('/user', [
  check('username').isEmail().withMessage('必须是有效的邮箱'),
  check('password').isLength({ min: 6 })
], userController);

标准验证器

express-validator 内置了 validator.js 提供的所有标准验证方法,例如:

  • isInt() - 验证是否为整数
  • isEmail() - 验证是否为有效邮箱
  • contains() - 验证是否包含特定字符串
  • isLength() - 验证字符串长度

这些验证器可以直接在验证链上调用,使用方式与 validator.js 一致。

清理链功能

验证链同时继承了清理链(Sanitization Chain)的所有功能,可以使用标准清理方法:

app.post('/register', [
  check('email').normalizeEmail().isEmail(),  // 先标准化邮箱格式再验证
  check('birthdate').toDate().isBefore()     // 转换为日期再验证
]);

常用清理方法包括 trim(), toLowerCase(), toInt() 等。

验证链特有方法

条件验证 .if()

.if() 方法允许根据条件决定是否继续验证:

check('oldPassword')
  .if(check('newPassword').exists())  // 只有新密码存在时才验证旧密码
  .notEmpty()
  .custom((val, { req }) => val !== req.body.newPassword);

自定义验证 .custom()

添加自定义验证逻辑:

check('username').custom(async (value) => {
  const user = await User.findByUsername(value);
  if (user) {
    throw new Error('用户名已存在');
  }
});

存在性验证 .exists()

验证字段是否存在:

check('apiKey').exists({ checkNull: true, checkFalsy: true });

可选字段 .optional()

将字段标记为可选:

check('phone').optional({ checkFalsy: true }).isMobilePhone();

类型验证

  • .isArray() - 验证是否为数组
  • .isObject() - 验证是否为对象
  • .isString() - 验证是否为字符串
check('tags').isArray({ min: 1, max: 5 });

其他实用方法

  • .bail() - 前面验证失败则停止后续验证
  • .not() - 反转下一个验证器的结果
  • .notEmpty() - 验证值非空
  • .withMessage() - 自定义错误消息
  • .run() - 手动执行验证链

最佳实践

  1. 使用工厂函数:当需要重用验证逻辑时
const validateEmail = () => check('email').isEmail().normalizeEmail();

app.post('/login', validateEmail(), ...);
app.post('/register', validateEmail(), ...);
  1. 合理使用 .bail():避免不必要的验证执行
check('email')
  .isEmail().bail()  // 如果不是邮箱就不检查黑名单
  .custom(checkBlacklist);
  1. 组合使用清理和验证:先清理再验证
check('price').trim().toFloat().isFloat({ min: 0 });

通过掌握这些验证链API,你可以构建出强大而灵活的请求验证逻辑,确保应用接收到的数据安全可靠。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

焦祯喜Kit

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

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

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

打赏作者

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

抵扣说明:

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

余额充值