Joi校验数组对象无法一次性返回所有错误的问题求助
解决Joi数组对象校验只返回首个错误的问题
要让Joi一次性返回所有校验错误,只需两步调整:
1. 关闭abortEarly校验选项
Joi默认开启abortEarly: true,遇到第一个错误就停止后续校验。调用validate时显式关闭该选项,就能让Joi遍历完所有字段和数组元素。
2. 调整字段错误定义方式
不要直接用.error(new Error(...))定义单个字段错误,这种方式会直接抛出单个错误,打断错误收集流程。改用Joi内置的required消息配置,或messages()方法统一设置错误文本。
完整示例代码
// 单个对象的校验Schema const serviceSchema = Joi.object({ firstName: Joi.string() .required({ message: "first name is required" }), lastName: Joi.string() .required({ message: "last name is required" }) }); // 数组校验Schema const servicesSchema = Joi.array().items(serviceSchema); // 待校验的输入数据 const inputFields = [ { firstName: "", lastName: "" }, { firstName: "", lastName: "" } ]; // 执行校验,关闭abortEarly const validationResult = servicesSchema.validate(inputFields, { abortEarly: false }); if (validationResult.error) { // 所有错误都在error.details数组中 validationResult.error.details.forEach(err => { // err.path标识错误位置,比如[0, 'firstName']对应数组第0项的firstName字段 console.log(`位置${err.path.join('.')}: ${err.message}`); }); }
错误信息说明
error.details数组中的每个元素包含关键信息:
path: 数组类型,精准定位错误所在的具体位置(如[1, 'lastName']对应第二个对象的lastName字段)message: 自定义的错误提示文本type: 错误类型(如string.empty、any.required)
通过path可以快速匹配到表单对应位置,实现逐个字段的错误提示展示。
内容的提问来源于stack exchange,提问作者Nabeel Mhd
相关产品推荐
相关产品推荐

