Express-Validator 5.3.0 数据过滤与净化 API 详解
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
前言
在 Web 开发中,处理用户输入数据是至关重要的环节。Express-Validator 作为 Express 中间件,提供了强大的数据验证和净化功能。本文将重点介绍其数据过滤与净化 API,帮助开发者更好地理解和运用这些功能。
数据提取:matchedData 方法
matchedData
是一个实用方法,用于从请求对象中提取经过验证的数据。
基本用法
const { matchedData } = require('express-validator/filter');
app.post('/example', check('username').isLength({ min: 5 }), (req, res) => {
const data = matchedData(req);
console.log(data); // 包含所有通过验证的字段
});
配置选项
matchedData
方法支持以下配置选项:
-
includeOptionals(默认 false)
- 设置为 true 时,包含可选字段数据
-
onlyValidData(默认 true)
- 设置为 false 时,包含未通过验证的字段数据
-
locations(默认 undefined)
- 指定数据来源位置数组,可选值:
body
,cookies
,headers
,params
,query
- 指定数据来源位置数组,可选值:
实际应用场景
// 假设请求包含:
// req.query = { page: '1' }
// req.body = { username: 'john_doe' }
app.get('/search', [
check('page').isInt(),
check('username').isLength({ min: 3 })
], (req, res) => {
const queryData = matchedData(req, { locations: ['query'] });
const bodyData = matchedData(req, { locations: ['body'] });
// queryData: { page: 1 }
// bodyData: { username: 'john_doe' }
});
数据净化方法
Express-Validator 提供了一系列数据净化方法,用于清理和标准化输入数据。
通用净化方法:sanitize
sanitize
是最基础的净化方法,可以从多个请求位置净化数据:
const { sanitize } = require('express-validator/filter');
app.post('/register', [
sanitize('username').trim(),
sanitize('email').normalizeEmail()
], registerHandler);
特定位置净化方法
为了更精确地控制净化位置,Express-Validator 提供了针对特定请求位置的净化方法:
- sanitizeBody - 仅净化 req.body
- sanitizeCookie - 仅净化 req.cookies
- sanitizeParam - 仅净化 req.params
- sanitizeQuery - 仅净化 req.query
app.get('/user/:id', [
sanitizeParam('id').toInt(), // 只净化URL参数
sanitizeQuery('page').toInt() // 只净化查询参数
], getUserHandler);
自定义净化函数:buildSanitizeFunction
对于需要从特定位置组合净化数据的场景,可以使用 buildSanitizeFunction
创建自定义净化函数:
const { buildSanitizeFunction } = require('express-validator/filter');
// 创建同时净化body和query的自定义函数
const sanitizeBodyAndQuery = buildSanitizeFunction(['body', 'query']);
app.put('/product', [
sanitizeBodyAndQuery('price').toFloat(),
sanitizeBodyAndQuery('quantity').toInt()
], updateProductHandler);
最佳实践建议
-
明确净化范围:尽量使用特定位置的净化方法(如 sanitizeBody),避免意外净化其他位置的数据
-
验证前净化:考虑在验证链之前先执行净化操作,确保验证的是已清理的数据
-
合理使用 matchedData:在控制器中优先使用 matchedData 获取数据,而不是直接访问 req.body 等
-
错误处理:即使使用净化方法,也要做好错误处理,因为净化可能不会解决所有数据问题
总结
Express-Validator 的过滤与净化 API 为处理用户输入提供了强大而灵活的工具。通过合理运用 matchedData 和各种净化方法,开发者可以更安全、更高效地处理 Web 应用中的各种输入数据。理解这些 API 的工作原理和适用场景,将有助于构建更健壮的 Express 应用程序。
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考