Express-Validator 项目中的 Sanitization Chain API 详解
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
什么是 Sanitization Chain
Sanitization Chain(净化链)是 express-validator 中的一个中间件概念,它允许开发者对请求数据进行一系列的净化处理。与验证链类似,净化链可以包含多个净化器(sanitizer),这些净化器会按照添加顺序依次执行,对请求字段进行修改。
基本用法
净化链应该被传递给 Express 的路由处理器。下面是一个简单的例子:
const { body } = require('express-validator');
app.get('/', body('trimMe').trim(), (req, res, next) => {
// 如果 req.body.trimMe 原始值是 " something "
// 经过净化后会变成 "something"
console.log(req.body.trimMe);
});
标准净化器
express-validator 提供了 validator.js 中所有的净化方法作为标准净化器,包括但不限于:
trim()
:去除字符串两端的空白字符toInt()
:将值转换为整数normalizeEmail()
:标准化电子邮件地址escape()
:转义 HTML 特殊字符
这些方法可以直接在净化链中使用,无需额外配置。
自定义净化器
除了标准净化器外,express-validator 还提供了强大的自定义净化功能:
customSanitizer 方法
.customSanitizer()
允许你定义自己的净化逻辑:
const { param } = require('express-validator');
app.get('/object/:id', param('id').customSanitizer((value, { req }) => {
return req.query.type === 'user' ? ObjectId(value) : Number(value);
}), objectHandler)
这个方法接收一个净化函数,该函数会接收字段值和一些上下文信息(请求对象、位置和路径),并返回净化后的值。
实用净化方法
默认值设置
.default()
方法可以在字段值为空、null、undefined 或 NaN 时设置默认值:
app.post('/', [body('username').default('foo')], (req, res, next) => {
// 各种情况的处理结果:
// 'bar' => 'bar' (保留原值)
// '' => 'foo' (使用默认值)
// undefined => 'foo' (使用默认值)
// null => 'foo' (使用默认值)
// NaN => 'foo' (使用默认值)
});
值替换
.replace()
方法可以替换特定的值:
app.post('/', [body('username').replace(['bar', 'BAR'], 'foo')], (req, res, next) => {
// 'bar_' => 'bar_' (不匹配)
// 'bar' => 'foo' (匹配替换)
// 'BAR' => 'foo' (匹配替换)
});
强制运行净化链
.run()
方法允许你以命令式的方式运行净化链:
app.post('/create-post', async (req, res, next) => {
await check('content').escape().trim().run(req);
// 净化前: ' hey your forum is amazing! <script>runEvilFunction();</script> '
// 净化后: 'hey your forum is amazing! <script>runEvilFunction();</script>'
});
类型转换方法
转换为数组
.toArray()
方法可以将任何值转换为数组:
app.post('/', [body('checkboxes').toArray()], (req, res, next) => {
// ['foo', 'bar] => ['foo', 'bar'] (保持不变)
// 'foo' => ['foo'] (字符串转为单元素数组)
// undefined => [] (空数组)
});
大小写转换
.toLowerCase()
和 .toUpperCase()
方法可以转换字符串大小写:
app.post('/', [body('username').toLowerCase()], (req, res, next) => {
// 'Foo' => 'foo'
// undefined => undefined (非字符串值保持不变)
});
app.post('/', [body('username').toUpperCase()], (req, res, next) => {
// 'Foo' => 'FOO'
// undefined => undefined (非字符串值保持不变)
});
最佳实践建议
-
顺序很重要:净化器会按照添加顺序执行,例如先
.trim()
再.toLowerCase()
与反过来顺序效果可能不同。 -
合理使用默认值:
.default()
可以简化后续处理逻辑,但要确保默认值确实符合业务需求。 -
注意性能:自定义净化器中避免复杂计算,特别是处理大量请求时。
-
结合验证使用:通常建议先净化数据再进行验证,确保验证逻辑处理的是标准化后的数据。
通过合理使用这些净化方法,你可以确保应用程序处理的数据更加规范和安全,减少因数据格式问题导致的错误和安全风险。
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考