Express-Validator 项目中的 Sanitization Chain API 详解
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
什么是 Sanitization Chain
Sanitization Chain(净化链)是 express-validator 中的一个中间件概念,它允许开发者对传入的请求数据进行一系列的净化处理。与验证链类似,净化链可以包含多个净化器,这些净化器会按照添加顺序依次执行,最终得到处理后的数据。
基本用法
净化链通常被传递给 Express 的路由处理器。下面是一个简单的示例:
const { body } = require('express-validator');
app.get('/', body('trimMe').trim(), (req, res, next) => {
// 如果 req.body.trimMe 原来是 " something "
// 经过处理后将会变成 "something"
console.log(req.body.trimMe);
});
在这个例子中,我们使用了 .trim()
净化器来去除字符串两端的空白字符。
标准净化器
express-validator 内置了 validator.js 提供的所有净化方法,这些被称为"标准净化器"。常见的有:
trim()
:去除字符串两端的空白字符toInt()
:将字符串转换为整数normalizeEmail()
:标准化电子邮件地址escape()
:转义 HTML 特殊字符
需要注意的是,validator.js 只接受字符串作为输入,因此任何需要被标准净化器处理的值(包括数组和对象)都会首先被转换为字符串类型。
扩展方法
除了标准净化器外,express-validator 还提供了一些额外的净化方法:
自定义净化器 .customSanitizer()
允许开发者定义自己的净化逻辑:
param('id').customSanitizer((value, { req }) => {
return req.query.type === 'user' ? ObjectId(value) : Number(value);
})
默认值 .default()
当值为空字符串、null、undefined 或 NaN 时,使用指定的默认值:
body('username').default('foo')
替换值 .replace()
当值匹配给定数组中的任意元素时,替换为新的值:
body('username').replace(['bar', 'BAR'], 'foo')
强制运行 .run()
以命令式的方式运行净化链:
await check('content').escape().trim().run(req);
转换为数组 .toArray()
将值转换为数组,undefined 会转换为空数组:
body('checkboxes').toArray()
大小写转换
.toLowerCase()
:转换为小写.toUpperCase()
:转换为大写
实际应用场景
- 用户输入净化:去除多余空格、转义特殊字符防止安全问题
- 数据标准化:统一日期格式、电话号码格式等
- 类型转换:将字符串转换为数字、布尔值等
- 默认值处理:为可选字段提供默认值
最佳实践
- 净化顺序很重要:先进行类型转换,再进行格式处理
- 结合验证使用:先验证数据有效性,再进行净化处理
- 注意性能:避免不必要的净化操作
- 记录原始值:在某些场景下可能需要保留原始数据
通过合理使用 express-validator 的净化链功能,可以大大提高应用程序的数据质量和安全性,减少因数据格式问题导致的错误和潜在风险。
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考