express-validator 6.6.0 验证链(Validation Chain)完全指南

express-validator 6.6.0 验证链(Validation Chain)完全指南

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

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

验证链基础概念

验证链本质上是一个中间件,应该传递给 Express 的路由处理器。它具有以下特点:

  1. 链式调用:可以在一个链上添加多个验证器和清理器
  2. 顺序执行:按照添加顺序依次执行验证和清理
  3. 可变性:每次调用方法都会修改链本身
// 基本使用示例
app.post('/user', [
  check('username').isLength({ min: 5 }).trim(),
  check('email').isEmail().normalizeEmail()
], userController);

标准验证器

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

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

这些方法可以直接在验证链上调用。

清理链功能

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

app.post('/register', [
  // 使用清理器后再验证
  check('email').trim().normalizeEmail().isEmail(),
  check('age').toInt().isInt({ min: 18 })
]);

常用清理方法包括:

  • trim() - 去除两端空格
  • toInt() - 转换为整数
  • toDate() - 转换为日期
  • escape() - 转义HTML
  • normalizeEmail() - 标准化邮箱格式

验证链特有方法

条件验证 .if()

只在满足条件时执行后续验证:

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

自定义验证 .custom()

添加自定义验证逻辑:

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

存在性检查 .exists()

验证字段是否存在:

check('authToken').exists() // 不允许undefined
check('authToken').exists({ checkNull: true }) // 不允许null或undefined

可选字段 .optional()

将字段标记为可选:

check('displayName').optional() // 允许undefined
check('displayName').optional({ nullable: true }) // 允许null或undefined

错误消息 .withMessage()

自定义错误消息:

check('phone')
  .isMobilePhone()
  .withMessage('请输入有效的手机号码')

验证中断 .bail()

在验证失败时停止后续验证:

check('email')
  .isEmail().bail() // 如果不是邮箱则停止
  .custom(checkEmailDomain) // 只有邮箱格式正确才检查域名

手动执行 .run()

手动运行验证链:

app.post('/api', async (req, res) => {
  await check('token').notEmpty().run(req);
  const result = validationResult(req);
  // 处理结果...
});

最佳实践

  1. 合理排序:先清理后验证
  2. 使用bail:避免不必要的验证
  3. 重用链:通过工厂函数创建可重用验证链
  4. 错误消息:提供用户友好的错误提示
  5. 异步验证:使用async/await处理异步操作
// 验证链工厂函数示例
const validateEmail = () => check('email')
  .trim()
  .normalizeEmail()
  .isEmail()
  .withMessage('无效的邮箱地址');

app.post('/subscribe', validateEmail(), subscribeController);

通过掌握这些验证链的使用方法,你可以构建出强大而灵活的请求验证系统,确保应用接收到的数据都是有效且安全的。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咎岭娴Homer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值