Express-Validator 6.2.0 中的模式验证(Schema Validation)详解

Express-Validator 6.2.0 中的模式验证(Schema Validation)详解

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

什么是模式验证

模式验证是 Express-Validator 提供的一种基于对象结构的验证方式,它允许开发者通过定义清晰的 JSON 结构来描述请求参数的验证规则。相比链式调用,模式验证提供了更直观、更结构化的方式来组织验证逻辑,特别适合处理复杂请求参数的场景。

模式验证的基本结构

模式验证的核心是一个对象,其中每个键代表要验证的字段路径,值则是一个包含验证规则的对象。基本结构如下:

{
  字段名: {
    // 验证规则和配置
  }
}

关键配置项详解

1. 字段位置(in)

in 属性用于指定字段在请求中的位置,可以是以下值之一或它们的数组组合:

  • body - 请求体
  • cookies - cookies
  • headers - 请求头
  • params - URL参数
  • query - 查询字符串

如果不指定,则会在所有位置查找该字段。

2. 错误消息(errorMessage)

可以为每个验证规则指定自定义的错误消息,当验证失败时返回给客户端。

3. 内置验证器

Express-Validator 提供了丰富的内置验证器,如:

  • isInt - 验证是否为整数
  • isLength - 验证长度
  • isUppercase - 验证是否全大写
  • isPostalCode - 验证邮政编码格式

4. 自定义验证器

通过 custom 属性可以定义完全自定义的验证逻辑:

custom: {
  options: (value, { req, location, path }) => {
    // 自定义验证逻辑
    return value === 'expected';
  }
}

5. 数据清理器(Sanitizer)

模式验证同样支持数据清理,包括内置清理器和自定义清理器:

// 内置清理器
toInt: true

// 自定义清理器
customSanitizer: {
  options: (value) => {
    return value.trim();
  }
}

高级特性

1. 嵌套字段验证

支持使用通配符 * 和点号 . 来验证嵌套对象或数组:

'addresses.*.postalCode': {
  isPostalCode: true
}

2. 可选字段

通过 optional 配置可以使字段在未提供时跳过验证:

optional: { options: { nullable: true } }

3. 验证否定

使用 negated: true 可以反转验证器的结果:

isUppercase: {
  negated: true // 验证字段不是全大写
}

实际应用示例

以下是一个完整的用户密码修改接口的验证示例:

const { checkSchema } = require('express-validator');

app.put('/user/:id/password', checkSchema({
  id: {
    in: ['params'],
    errorMessage: '用户ID必须为整数',
    isInt: true,
    toInt: true
  },
  oldPassword: {
    isLength: {
      errorMessage: '旧密码长度至少为6位',
      options: { min: 6 }
    }
  },
  newPassword: {
    isLength: {
      errorMessage: '新密码长度至少为8位',
      options: { min: 8 }
    },
    custom: {
      options: (value, { req }) => {
        if (value === req.body.oldPassword) {
          throw new Error('新密码不能与旧密码相同');
        }
        return true;
      }
    }
  },
  confirmPassword: {
    custom: {
      options: (value, { req }) => {
        if (value !== req.body.newPassword) {
          throw new Error('两次输入的密码不一致');
        }
        return true;
      }
    }
  }
}), (req, res) => {
  // 处理请求
});

最佳实践

  1. 模块化组织:将复杂的验证模式拆分为单独的文件或模块,提高代码可维护性。

  2. 错误消息国际化:可以在模式中动态生成错误消息,支持多语言。

  3. 复用验证模式:对于常用的验证模式(如分页参数),可以提取为公共模式。

  4. 结合类型检查:在TypeScript项目中,可以为验证模式定义接口类型,获得更好的类型提示。

模式验证是 Express-Validator 中非常强大的功能,它通过结构化的方式让请求验证变得更加清晰和易于维护。对于复杂的API接口,采用模式验证可以显著提高代码的可读性和可维护性。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

余靖年Veronica

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

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

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

打赏作者

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

抵扣说明:

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

余额充值