express-validator 6.6.0 验证链(Validation Chain)完全指南
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
express-validator 是一个强大的 Express 中间件,用于验证和清理传入的请求数据。其中验证链(Validation Chain)是其核心功能之一,本文将深入解析验证链的完整使用方法。
验证链基础概念
验证链本质上是一个中间件,应该传递给 Express 的路由处理器。它具有以下特点:
- 链式调用:可以在一个链上添加多个验证器和清理器
- 顺序执行:按照添加顺序依次执行验证和清理
- 可变性:每次调用方法都会修改链本身
// 基本使用示例
app.post('/user', [
check('username').isLength({ min: 5 }).trim(),
check('email').isEmail().normalizeEmail()
], userController);
标准验证器
express-validator 内置了 validator.js 提供的所有标准验证方法,包括:
isEmail()
- 验证是否为有效邮箱isInt()
- 验证是否为整数isLength()
- 验证长度contains()
- 验证是否包含特定字符串- 等等...
这些方法可以直接在验证链上调用。
清理链功能
验证链同时继承了清理链(Sanitization Chain)的所有功能,可以使用标准清理方法:
app.post('/register', [
// 使用清理器后再验证
check('email').trim().normalizeEmail().isEmail(),
check('age').toInt().isInt({ min: 18 })
]);
常用清理方法包括:
trim()
- 去除两端空格toInt()
- 转换为整数toDate()
- 转换为日期escape()
- 转义HTMLnormalizeEmail()
- 标准化邮箱格式
验证链特有方法
条件验证 .if()
只在满足条件时执行后续验证:
check('oldPassword')
.if(check('newPassword').exists()) // 只有在新密码存在时才验证旧密码
.notEmpty()
.custom((val, { req }) => val !== req.body.newPassword)
自定义验证 .custom()
添加自定义验证逻辑:
check('username')
.custom(async (username) => {
const user = await User.findOne({ username });
if (user) {
throw new Error('用户名已存在');
}
})
存在性检查 .exists()
验证字段是否存在:
check('authToken').exists() // 不允许undefined
check('authToken').exists({ checkNull: true }) // 不允许null或undefined
可选字段 .optional()
将字段标记为可选:
check('displayName').optional() // 允许undefined
check('displayName').optional({ nullable: true }) // 允许null或undefined
错误消息 .withMessage()
自定义错误消息:
check('phone')
.isMobilePhone()
.withMessage('请输入有效的手机号码')
验证中断 .bail()
在验证失败时停止后续验证:
check('email')
.isEmail().bail() // 如果不是邮箱则停止
.custom(checkEmailDomain) // 只有邮箱格式正确才检查域名
手动执行 .run()
手动运行验证链:
app.post('/api', async (req, res) => {
await check('token').notEmpty().run(req);
const result = validationResult(req);
// 处理结果...
});
最佳实践
- 合理排序:先清理后验证
- 使用bail:避免不必要的验证
- 重用链:通过工厂函数创建可重用验证链
- 错误消息:提供用户友好的错误提示
- 异步验证:使用async/await处理异步操作
// 验证链工厂函数示例
const validateEmail = () => check('email')
.trim()
.normalizeEmail()
.isEmail()
.withMessage('无效的邮箱地址');
app.post('/subscribe', validateEmail(), subscribeController);
通过掌握这些验证链的使用方法,你可以构建出强大而灵活的请求验证系统,确保应用接收到的数据都是有效且安全的。
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考