Express-Validator 6.6.0 中的模式验证(Schema Validation)详解
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
什么是模式验证
模式验证是 Express-Validator 提供的一种基于对象结构的验证方式,它允许开发者通过定义清晰的对象结构来组织请求参数的验证和清理规则。相比传统的链式调用方式,模式验证提供了更结构化、更易维护的验证方案。
模式验证的基本结构
模式验证的核心是一个对象,其中:
- 键(key)表示要验证的字段路径
- 值(value)是一个包含验证和清理规则的对象
每个字段的验证对象可以包含以下内容:
- 字段位置定义(
in
属性) - 错误消息配置
- 验证器配置
- 清理器配置
- 自定义验证/清理逻辑
详细配置解析
1. 字段位置定义
使用in
属性可以指定字段的来源位置,可选值包括:
body
:请求体cookies
:Cookiesheaders
:请求头params
:URL参数query
:查询字符串
如果不指定in
属性,则会在所有位置检查该字段。
id: {
in: ['params', 'query'], // 检查params和query中的id字段
errorMessage: 'ID is wrong',
isInt: true
}
2. 验证器配置
验证器可以直接作为属性配置,也可以嵌套在对象中:
password: {
isLength: {
errorMessage: 'Password should be at least 7 chars long',
options: { min: 7 }
}
}
3. 清理器配置
清理器可以用于转换输入数据:
id: {
isInt: true,
toInt: true // 将输入转换为整数
}
4. 自定义验证和清理
对于复杂场景,可以使用自定义验证器和清理器:
myCustomField: {
custom: {
options: (value, { req, location, path }) => {
// 自定义验证逻辑
return value + req.body.foo + location + path;
}
},
customSanitizer: {
options: (value, { req, location, path }) => {
// 自定义清理逻辑
let sanitizedValue = req.body.foo ? parseInt(value) : 0;
return sanitizedValue;
}
}
}
5. 特殊配置选项
negated
:否定验证器optional
:使字段可选- 支持嵌套字段验证(使用
*
通配符)
firstName: {
isUppercase: {
negated: true, // 验证字段不是大写
}
},
'addresses.*.postalCode': {
optional: { options: { nullable: true } }, // 嵌套字段可选
isPostalCode: true
}
实际应用示例
以下是一个完整的用户密码更新接口的验证示例:
const { checkSchema } = require('express-validator');
app.put('/user/:id/password', checkSchema({
id: {
in: ['params'],
errorMessage: '无效的用户ID',
isInt: true,
toInt: true
},
currentPassword: {
exists: {
errorMessage: '当前密码不能为空'
},
isLength: {
options: { min: 6 },
errorMessage: '当前密码长度至少6位'
}
},
newPassword: {
isLength: {
options: { min: 8 },
errorMessage: '新密码长度至少8位'
},
matches: {
options: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$/,
errorMessage: '密码必须包含大小写字母和数字'
},
custom: {
options: (value, { req }) => {
if (value === req.body.currentPassword) {
throw new Error('新密码不能与当前密码相同');
}
return true;
}
}
},
confirmPassword: {
custom: {
options: (value, { req }) => {
if (value !== req.body.newPassword) {
throw new Error('两次输入的密码不匹配');
}
return true;
}
}
}
}), (req, res) => {
// 处理请求
res.send('密码更新成功');
});
最佳实践建议
- 错误消息统一管理:将错误消息提取到常量或配置文件中,便于维护和国际化
- 复用验证模式:将常用的验证模式提取为独立模块
- 合理使用嵌套验证:对于复杂数据结构,使用通配符简化验证代码
- 组合使用验证和清理:先清理再验证,确保数据格式正确
- 性能考虑:避免在自定义验证器中执行耗时操作
总结
Express-Validator 的模式验证功能提供了一种结构化、声明式的方式来定义请求验证规则。通过合理使用各种验证器和清理器,可以构建出既强大又易于维护的验证逻辑。无论是简单的字段验证还是复杂的嵌套结构验证,模式验证都能提供清晰的解决方案。
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考