Express-Validator 6.2.0 中的模式验证(Schema Validation)详解
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
什么是模式验证
模式验证是 Express-Validator 提供的一种基于对象结构的验证方式,它允许开发者通过定义清晰的 JSON 结构来描述请求参数的验证规则。相比链式调用,模式验证提供了更直观、更结构化的方式来组织验证逻辑,特别适合处理复杂请求参数的场景。
模式验证的基本结构
模式验证的核心是一个对象,其中每个键代表要验证的字段路径,值则是一个包含验证规则的对象。基本结构如下:
{
字段名: {
// 验证规则和配置
}
}
关键配置项详解
1. 字段位置(in)
in
属性用于指定字段在请求中的位置,可以是以下值之一或它们的数组组合:
body
- 请求体cookies
- cookiesheaders
- 请求头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) => {
// 处理请求
});
最佳实践
-
模块化组织:将复杂的验证模式拆分为单独的文件或模块,提高代码可维护性。
-
错误消息国际化:可以在模式中动态生成错误消息,支持多语言。
-
复用验证模式:对于常用的验证模式(如分页参数),可以提取为公共模式。
-
结合类型检查:在TypeScript项目中,可以为验证模式定义接口类型,获得更好的类型提示。
模式验证是 Express-Validator 中非常强大的功能,它通过结构化的方式让请求验证变得更加清晰和易于维护。对于复杂的API接口,采用模式验证可以显著提高代码的可读性和可维护性。
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考