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

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

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

什么是模式验证

模式验证是 express-validator 提供的一种结构化、声明式的请求数据验证方式。与传统的链式调用验证方法不同,模式验证允许开发者通过一个 JavaScript 对象来定义所有验证规则,这使得验证逻辑更加集中、清晰且易于维护。

模式验证的基本结构

模式验证对象是一个键值对集合,其中:

  • 键(key)表示要验证的字段路径
  • 值(value)是一个包含验证规则的对象

每个验证规则对象可以包含以下内容:

  1. 字段位置定义(in)
  2. 错误消息(errorMessage)
  3. 验证器(validator)
  4. 清理器(sanitizer)

核心功能详解

1. 字段位置定义

通过 in 属性可以指定字段的来源位置,可选值包括:

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

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

id: {
  in: ['params', 'query'], // 同时检查params和query中的id字段
  errorMessage: 'ID格式错误',
  isInt: true
}

2. 验证器使用

express-validator 提供了丰富的内置验证器,如 isIntisEmail 等。在模式验证中,可以直接使用这些验证器:

password: {
  isLength: {
    errorMessage: '密码长度至少7个字符',
    options: { min: 7 }
  }
}

3. 清理器应用

清理器用于对输入数据进行格式化处理,可以与验证器配合使用:

firstName: {
  rtrim: {  // 清理右侧空白和破折号
    options: [' -']
  },
  isUppercase: {
    negated: true  // 验证不是全大写
  }
}

4. 自定义验证与清理

模式验证支持自定义验证逻辑和清理逻辑:

myCustomField: {
  custom: {
    options: (value, { req, location, path }) => {
      // 自定义验证逻辑
      return value + req.body.foo + location + path;
    }
  },
  customSanitizer: {
    options: (value, { req, location, path }) => {
      // 自定义清理逻辑
      return req.body.foo ? parseInt(value) : 0;
    }
  }
}

5. 嵌套字段验证

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

'addresses.*.postalCode': {
  optional: { options: { nullable: true } },  // 允许为null或undefined
  isPostalCode: true  // 验证邮政编码格式
}

实际应用示例

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

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

app.put('/user/:id/password', checkSchema({
  id: {
    in: ['params'],
    errorMessage: '用户ID必须为整数',
    isInt: true,
    toInt: true  // 转换为整数
  },
  oldPassword: {
    isLength: {
      errorMessage: '原密码不能为空',
      options: { min: 1 }
    }
  },
  newPassword: {
    isLength: {
      errorMessage: '新密码长度至少8个字符',
      options: { min: 8 }
    },
    matches: {
      errorMessage: '密码必须包含字母和数字',
      options: /^(?=.*[A-Za-z])(?=.*\d)/
    }
  },
  confirmPassword: {
    custom: {
      options: (value, { req }) => {
        if (value !== req.body.newPassword) {
          throw new Error('两次输入的密码不一致');
        }
        return true;
      }
    }
  }
}), (req, res) => {
  // 处理请求...
});

最佳实践建议

  1. 错误消息统一管理:将错误消息提取为常量或从配置文件中读取,便于维护和多语言支持。

  2. 复用验证模式:将常用的验证模式提取为模块,在不同路由中复用。

  3. 组合使用:可以将模式验证与链式验证结合使用,灵活应对复杂场景。

  4. 性能考虑:对于大型对象,模式验证可能比链式验证稍慢,应根据实际情况选择。

  5. 文档化:为验证模式添加注释,说明每个字段的业务规则。

模式验证是 express-validator 中一个非常强大的功能,它通过声明式的方式让数据验证逻辑更加清晰、易于维护。无论是简单的表单验证还是复杂的业务规则检查,模式验证都能提供优雅的解决方案。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

强妲佳Darlene

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

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

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

打赏作者

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

抵扣说明:

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

余额充值