如何批量清理包含复杂对象的所有请求体参数?
实现请求体批量清理的两种实用方法
我完全懂你的需求——不想手动逐个属性写req.body.a = req.sanitize(req.body.a)这种重复代码,想要像ASP.NET MVC/WebAPI那样自动批量清理整个请求体。下面分享两种靠谱的实现方式:
方法1:用express-validator的批量匹配语法
如果你用的是常用的express-validator库(req.sanitize通常来自这个库),可以直接用通配符*匹配请求体的所有属性,链式调用你需要的清理规则:
const { sanitizeBody } = require('express-validator'); // 在路由中间件里使用 app.post('/your-endpoint', [ // 批量清理所有属性:比如去除首尾空格+转义HTML sanitizeBody('*').trim().escape() ], (req, res) => { // 此时req.body已经完成全量清理 res.send(req.body); });
这种方式简单直接,适合用内置清理规则的场景,还能针对特定属性追加单独规则(比如某些属性需要转成数字,再单独加一行sanitizeBody('numericField').toInt())。
方法2:自定义递归清理函数(灵活适配复杂结构)
如果你的请求体有嵌套对象、数组,或者需要自定义清理逻辑,写一个递归函数遍历所有属性是更灵活的选择:
function deepSanitize(obj, sanitizeFn) { // 处理非对象/数组的基础类型 if (typeof obj !== 'object' || obj === null) { return sanitizeFn(obj); } // 处理数组:遍历每个元素递归清理 if (Array.isArray(obj)) { return obj.map(item => deepSanitize(item, sanitizeFn)); } // 处理对象:遍历每个键值对递归清理 const sanitizedObj = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { sanitizedObj[key] = deepSanitize(obj[key], sanitizeFn); } } return sanitizedObj; } // 在路由里使用:把req.sanitize传进去作为清理函数 app.post('/your-endpoint', (req, res) => { req.body = deepSanitize(req.body, req.sanitize); // 现在req.body的所有属性(包括嵌套的)都被清理过了 res.send(req.body); });
这个函数会自动处理多层嵌套的对象和数组,不管请求体结构多复杂,都能一次性完成全量清理,完全替代手动逐个属性处理的麻烦。
注意事项
- 确保
req.sanitize已经被正确挂载:如果用express-validator,要先在app里完成中间件的注册配置。 - 清理时机:建议在验证之前做清理,避免脏数据影响后续的验证逻辑。
内容的提问来源于stack exchange,提问作者manwithplanet
相关产品推荐
相关产品推荐

