如何让ExpressValidator验证空数组或数组内容?
解决express-validator中空数组合法的校验问题
你可以通过先校验数组本身的类型,再结合元素校验的方式实现需求:空数组合法,非空数组的每个元素必须通过checkAnimal校验。
方案1:合并数组校验与元素校验
直接在数组级别的校验里处理空数组的情况,同时验证非空数组的元素:
const { body } = require('express-validator'); // 完整校验规则 body('animals') // 如果animals字段可选(允许不传),加上这一行;如果必须传数组,去掉 .optional() .isArray().withMessage('animals must be an array') .custom((array) => { // 空数组直接通过 if (array.length === 0) return true; // 非空数组则每个元素都要通过checkAnimal校验 return array.every(checkAnimal); }) .withMessage('Must provide an array containing valid animals')
方案2:拆分数组校验与元素校验
保留你原本的元素校验逻辑,同时新增数组类型校验,空数组会自动通过元素校验(因为没有元素需要校验):
const { body } = require('express-validator'); // 先确保animals是数组(空数组也符合isArray规则) body('animals') .optional() // 可选,根据是否允许字段不存在决定 .isArray().withMessage('animals must be an array'), // 仅当数组非空时,才会触发每个元素的校验 body('animals.*') .custom(checkAnimal) .withMessage('Must provide an array containing valid animals')
两种方案的区别
- 方案1把逻辑集中在一处,错误提示统一;
- 方案2更贴近你原本的代码结构,维护起来更直观,空数组时
animals.*的校验规则不会被触发,自然通过。
内容的提问来源于stack exchange,提问作者OhkaBaka
相关产品推荐
相关产品推荐

