使用Joi.array().items()验证时是否要求数组必须包含至少一个元素
Joi
array().items() 规则下空数组校验逻辑解答 核心结论
默认配置下,仅使用Joi.array().items(...)定义校验规则、未添加长度限制时,不会要求数组必须包含至少一个元素,空数组可以正常通过校验。
规则细节区分
很多开发者容易混淆两类校验规则的作用边界:
items(...)规则仅约束数组内存在的元素的类型,不对数组的长度做任何限制- 字段级的
required()规则仅约束该字段不能为undefined/null,不限制数组本身的长度 - 只有主动添加
.min(1)规则时,才会要求数组至少包含1个元素,禁止空数组通过校验
校验示例
const Joi = require('joi'); // 场景1:仅定义元素类型规则 const noLimitSchema = Joi.array().items(Joi.string()); console.log(noLimitSchema.validate([]).error); // 无错误,空数组校验通过 console.log(noLimitSchema.validate(['test', 'demo']).error); // 无错误,符合预期 console.log(noLimitSchema.validate([123]).error); // 报错,数组元素类型不匹配 // 场景2:添加min(1)限制数组最小长度 const minLengthSchema = Joi.array().items(Joi.string()).min(1); console.log(minLengthSchema.validate([]).error); // 报错,数组长度不能小于1 // 场景3:添加字段required规则 const requiredFieldSchema = Joi.object({ list: Joi.array().items(Joi.string()).required() }); console.log(requiredFieldSchema.validate({ list: [] }).error); // 无错误,空数组合法 console.log(requiredFieldSchema.validate({}).error); // 报错,list字段缺失
内容的提问来源于stack exchange,提问作者Justin Kruse
相关产品推荐
相关产品推荐

