Express-Validator 项目中的 Schema 验证详解
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
什么是 Schema 验证
在 Express-Validator 项目中,Schema 验证是一种基于对象的验证和清理(sanitization)定义方式。它允许开发者以结构化的方式集中定义字段的验证规则、错误消息和清理逻辑,相比链式调用方式更加清晰和易于维护。
Schema 验证的基本结构
Schema 验证的基本结构是一个对象,其中:
- 键(Key):表示要验证的字段路径,可以是简单的字段名,也可以是嵌套路径(如
addresses.*.postalCode
) - 值(Value):一个配置对象,包含该字段的验证规则、清理规则和错误消息等
核心配置选项
1. 字段位置定义
通过 in
属性可以指定字段的来源位置:
id: {
in: ['params', 'query'], // 可以指定多个位置
errorMessage: 'ID is wrong',
isInt: true
}
如果不指定 in
属性,则会在所有请求位置(body、cookies、headers、params、query)中查找该字段。
2. 验证器配置
验证器可以直接作为属性配置:
password: {
isLength: {
errorMessage: 'Password should be at least 7 chars long',
options: { min: 7 }
}
}
也可以使用 negated
属性来反转验证逻辑:
firstName: {
isUppercase: {
negated: true // 表示字段不应该全大写
}
}
3. 自定义验证器
通过 custom
属性可以定义完全自定义的验证逻辑:
myCustomField: {
custom: {
options: (value, { req, location, path }) => {
// 自定义验证逻辑
return value + req.body.foo + location + path;
}
}
}
4. 清理器配置
清理器可以直接作为属性配置:
id: {
toInt: true // 将值转换为整数
}
或者使用 customSanitizer
定义自定义清理逻辑:
customSanitizer: {
options: (value, { req, location, path }) => {
let sanitizedValue;
if (req.body.foo && location && path) {
sanitizedValue = parseInt(value);
} else {
sanitizedValue = 0;
}
return sanitizedValue;
}
}
5. 嵌套字段验证
使用通配符 *
可以验证数组中的每个元素:
'addresses.*.postalCode': {
optional: true,
isPostalCode: true
}
实际应用示例
下面是一个完整的用户密码更新接口的 Schema 验证示例:
const { checkSchema } = require('express-validator/check');
app.put('/user/:id/password', checkSchema({
id: {
in: ['params'],
errorMessage: '无效的用户ID',
isInt: true,
toInt: true
},
currentPassword: {
exists: {
errorMessage: '当前密码不能为空'
},
isLength: {
errorMessage: '密码长度至少为8个字符',
options: { min: 8 }
}
},
newPassword: {
exists: {
errorMessage: '新密码不能为空'
},
isLength: {
errorMessage: '新密码长度至少为8个字符',
options: { min: 8 }
},
custom: {
options: (value, { req }) => {
if (value === req.body.currentPassword) {
throw new Error('新密码不能与当前密码相同');
}
return true;
}
}
},
confirmPassword: {
exists: {
errorMessage: '确认密码不能为空'
},
custom: {
options: (value, { req }) => {
if (value !== req.body.newPassword) {
throw new Error('两次输入的密码不匹配');
}
return true;
}
}
}
}), (req, res, next) => {
// 处理请求
});
Schema 验证的优势
- 集中管理:所有验证规则集中在一个对象中,便于维护
- 结构清晰:嵌套字段验证更加直观
- 复用方便:可以轻松地在多个路由间复用相同的验证规则
- 可读性强:配置化的方式使代码更易于理解
最佳实践
- 为每个字段提供明确的错误消息
- 合理使用
optional
和exists
来处理可选字段 - 对于复杂业务逻辑,优先使用自定义验证器
- 保持 Schema 的单一职责,避免过于复杂的验证逻辑
通过掌握 Express-Validator 的 Schema 验证功能,开发者可以构建出更加健壮和可维护的 API 验证层。
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考