使用Express Validator验证请求体对象数组时的通配符问题
问题分析与修正方案
你的代码主要存在两个关键问题,导致验证规则无法按预期生效:
1. 第一个验证规则逻辑完全写反
你当前的第一条规则是:
body().not().isArray().withMessage("success")
这是在禁止请求体是数组,但你的需求恰恰是请求体必须为数组格式(比如[{id:1}, {id:2}])。这条规则应该反过来,验证请求体必须是数组。
2. 根级数组的字段路径语法错误
当请求体本身就是根级数组时,body("*.id")的路径语法不生效——这个写法仅适用于对象内部的数组属性(比如请求体是{ array: [{id:1}] }时,array.*.id才能定位到数组元素的id)。
对于根级数组,正确的路径写法是body("[].id"),它会自动遍历数组中的每一个元素,检查其id字段是否符合规则。
修正后的完整代码
const app = require("express")(); const { validationResult, body } = require('express-validator'); app.post("/post", [ // 验证请求体必须是数组 body().isArray().withMessage("请求体必须为数组格式"), // 验证数组中每个元素的id不能为空 body("[].id").not().isEmpty().withMessage("数组中每个元素的id不能为空") ], (req,res,next)=>{ const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(422).json({ errors: errors.array() }); } res.send("Passed validation") }) app.listen(3000,()=>console.log("running on express !!!"))
额外说明
如果需要更复杂的数组元素验证(比如限制id为整数类型),可以扩展规则:
body("[].id").isInt().not().isEmpty().withMessage("每个元素的id必须是非空整数")
另外,也可以通过custom方法手动实现数组验证,适合更复杂的自定义逻辑场景:
body().custom((value) => { // 先验证是否为数组 if (!Array.isArray(value)) { throw new Error("请求体必须是数组"); } // 遍历每个元素验证id for (const item of value) { if (!item.id || typeof item.id !== 'number') { throw new Error("数组中每个元素必须包含非空的数字类型id"); } } return true; })
内容的提问来源于stack exchange,提问作者codefreaK
相关产品推荐
相关产品推荐

