Express-Validator 5.3.0 数据过滤与净化 API 详解

Express-Validator 5.3.0 数据过滤与净化 API 详解

express-validator 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 方法支持以下配置选项:

  1. includeOptionals(默认 false)

    • 设置为 true 时,包含可选字段数据
  2. onlyValidData(默认 true)

    • 设置为 false 时,包含未通过验证的字段数据
  3. 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 提供了针对特定请求位置的净化方法:

  1. sanitizeBody - 仅净化 req.body
  2. sanitizeCookie - 仅净化 req.cookies
  3. sanitizeParam - 仅净化 req.params
  4. 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);

最佳实践建议

  1. 明确净化范围:尽量使用特定位置的净化方法(如 sanitizeBody),避免意外净化其他位置的数据

  2. 验证前净化:考虑在验证链之前先执行净化操作,确保验证的是已清理的数据

  3. 合理使用 matchedData:在控制器中优先使用 matchedData 获取数据,而不是直接访问 req.body 等

  4. 错误处理:即使使用净化方法,也要做好错误处理,因为净化可能不会解决所有数据问题

总结

Express-Validator 的过滤与净化 API 为处理用户输入提供了强大而灵活的工具。通过合理运用 matchedData 和各种净化方法,开发者可以更安全、更高效地处理 Web 应用中的各种输入数据。理解这些 API 的工作原理和适用场景,将有助于构建更健壮的 Express 应用程序。

express-validator express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯璋旺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值