Express-Validator 6.1.0 中的模式验证(Schema Validation)详解
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
什么是模式验证
模式验证是 express-validator 提供的一种结构化、声明式的请求数据验证方式。与传统的链式调用验证方法不同,模式验证允许开发者通过一个 JavaScript 对象来定义所有验证规则,这使得验证逻辑更加集中、清晰且易于维护。
模式验证的基本结构
模式验证对象是一个键值对集合,其中:
- 键(key)表示要验证的字段路径
- 值(value)是一个包含验证规则的对象
每个验证规则对象可以包含以下内容:
- 字段位置定义(in)
- 错误消息(errorMessage)
- 验证器(validator)
- 清理器(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 提供了丰富的内置验证器,如 isInt
、isEmail
等。在模式验证中,可以直接使用这些验证器:
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) => {
// 处理请求...
});
最佳实践建议
-
错误消息统一管理:将错误消息提取为常量或从配置文件中读取,便于维护和多语言支持。
-
复用验证模式:将常用的验证模式提取为模块,在不同路由中复用。
-
组合使用:可以将模式验证与链式验证结合使用,灵活应对复杂场景。
-
性能考虑:对于大型对象,模式验证可能比链式验证稍慢,应根据实际情况选择。
-
文档化:为验证模式添加注释,说明每个字段的业务规则。
模式验证是 express-validator 中一个非常强大的功能,它通过声明式的方式让数据验证逻辑更加清晰、易于维护。无论是简单的表单验证还是复杂的业务规则检查,模式验证都能提供优雅的解决方案。
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考