express-validator 6.4.0 中的模式验证(Schema Validation)详解
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
express-validator 是一个强大的 Express 中间件,用于验证和清理传入的请求数据。在 6.4.0 版本中,它引入了一种更加结构化的验证方式——模式验证(Schema Validation),本文将深入解析这一功能。
什么是模式验证?
模式验证是一种基于对象的验证方式,它允许开发者以声明式的方式定义字段的验证规则和清理规则。相比传统的链式调用验证方法,模式验证提供了以下优势:
- 更清晰的代码结构
- 更易于维护的验证规则
- 支持嵌套对象验证
- 集中化的错误消息管理
基本语法结构
模式验证的基本结构是一个对象,其中键是字段路径,值是该字段的验证/清理配置对象:
const { checkSchema } = require('express-validator');
app.put('/path', checkSchema({
字段名: {
// 验证和清理配置
}
}), handler);
核心配置选项详解
1. 字段位置指定
使用 in
属性可以指定字段所在的位置,可选值包括:
body
- 请求体cookies
- cookiesheaders
- 请求头params
- URL 参数query
- 查询字符串
id: {
in: ['params', 'query'], // 同时检查 params 和 query
errorMessage: 'ID 错误',
isInt: true
}
2. 内置验证器
express-validator 提供了大量内置验证器,可以直接在模式中使用:
password: {
isLength: {
errorMessage: '密码至少7个字符',
options: { min: 7 }
}
}
3. 自定义验证器
通过 custom
属性可以定义自定义验证逻辑:
myField: {
custom: {
options: (value, { req, location, path }) => {
// 自定义验证逻辑
return value === req.body.otherField;
}
}
}
4. 清理器(Sanitizers)
模式验证同样支持数据清理:
firstName: {
rtrim: { // 移除右侧空格
options: [' -'], // 移除空格和短横线
}
}
5. 自定义清理器
myField: {
customSanitizer: {
options: (value) => {
return value.trim().toLowerCase();
}
}
}
高级特性
1. 嵌套对象验证
使用通配符 *
和点号 .
可以验证嵌套对象:
'addresses.*.postalCode': {
optional: { options: { nullable: true } },
isPostalCode: true
}
2. 可选字段
phone: {
optional: true, // 字段不存在时跳过验证
isMobilePhone: true
}
3. 否定验证器
username: {
isUppercase: {
negated: true, // 验证用户名不是全大写
}
}
实际应用示例
下面是一个完整的用户注册验证示例:
app.post('/register', checkSchema({
username: {
isLength: {
options: { min: 3, max: 20 },
errorMessage: '用户名长度应在3-20个字符之间'
},
matches: {
options: /^[a-zA-Z0-9_]+$/,
errorMessage: '用户名只能包含字母、数字和下划线'
}
},
email: {
isEmail: true,
normalizeEmail: true // 标准化电子邮件地址
},
password: {
isLength: { options: { min: 8 } },
matches: {
options: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$/,
errorMessage: '密码必须包含大小写字母和数字'
}
},
'profile.age': {
optional: true,
isInt: { options: { min: 18 } }
}
}), (req, res) => {
// 处理请求
});
最佳实践
- 分离验证逻辑:将验证模式定义在单独的文件中,保持路由文件简洁
- 重用验证模式:对于相同的验证逻辑,可以导出并复用验证模式
- 详细的错误消息:为每个验证规则提供明确的错误消息
- 合理的字段可选性:根据业务需求正确设置字段的
optional
属性
总结
express-validator 的模式验证功能提供了一种结构化、声明式的方法来定义请求数据的验证规则。通过本文的介绍,你应该已经掌握了如何利用这一强大功能来构建健壮的 API 输入验证系统。无论是简单字段还是复杂嵌套对象,模式验证都能提供清晰、灵活的解决方案。
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考