Joi 16及以上版本如何获取错误路径?
获取Joi 16+中的错误路径信息
别担心,Joi 16+并没有移除错误路径的获取能力——大概率是你在错误处理环节没拿到完整的ValidationError实例。我之前也踩过类似的坑,下面给你梳理正确的做法:
核心要点:捕获完整的ValidationError
Joi的validate或validateAsync方法返回的错误(当验证失败时)是一个ValidationError对象,它依然包含details数组,每个数组项里的path属性就是你需要的错误路径。
同步验证示例
const Joi = require('joi'); // 定义一个嵌套结构的schema const documentSchema = Joi.object({ user: Joi.object({ profile: Joi.object({ email: Joi.string().email().required() }).required() }).required() }); const invalidData = { user: {} }; try { const { error } = documentSchema.validate(invalidData, { abortEarly: false }); if (error) throw error; } catch (err) { if (err.isJoi) { // 生成带路径的错误提示 const errorMessages = err.details.map(detail => { // 用join把路径数组转成点分隔的字符串,更直观 const errorPath = detail.path.join('.'); return `Error in node: ${errorPath} - ${detail.message}`; }); console.log(errorMessages); // 输出示例:["Error in node: user.profile - "user.profile" is required"] } }
异步验证示例
如果你用的是validateAsync,处理逻辑几乎一致:
async function validateDocument(data) { try { await documentSchema.validateAsync(data, { abortEarly: false }); } catch (err) { if (err.isJoi) { const errorPaths = err.details.map(detail => detail.path); console.log('错误路径数组:', errorPaths); // 输出示例:[ ['user', 'profile'] ] } } }
注意事项
- 一定要开启
abortEarly: false,否则Joi会在遇到第一个错误就停止验证,你只能拿到一条错误信息。 - 确保捕获的是完整的
ValidationError,而不是只提取了err.message(这会丢失details和path信息)。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

