Yup自定义.test校验阻断其他规则执行 abortEarly配置无效问题
问题根因
你遇到的阻断问题和abortEarly配置无关,本质是自定义校验逻辑存在运行时异常导致校验直接终止,具体问题如下:
- 自定义test函数未处理空值等边界情况:当
dateOfBirth字段值为undefined、null或非字符串类型时,执行value.split('-')会直接抛出JS原生错误,Yup遇到此类未捕获的运行时异常会直接中断整个校验流程,不会继续执行其他字段的校验,也不会收集错误到error.inner中。 test配置项中的params: { abortEarly: false }是无效配置:params字段仅用来给错误提示模板做插值用,不控制校验行为,该配置不会生效。- 代码存在两处笔误:入参
context被写为cotext,错误提示里的年份格式YYY少写了一个Y,schema定义的shape方法结束括号拼写错误。
解决方案
按以下步骤修改代码即可解决阻断问题:
- 先在test函数开头补充边界值判断,避免运行时异常
- 移除test配置中无效的
params字段 - 修正所有笔误
修正后的自定义校验代码:
const dateFormatRequired = () => yup .string() .test({ name: 'date-format-bd', message:'Date format should be MM/DD/YYYY', test: (value, context) => { // 空值直接返回true,必填校验可通过链式调用.required()单独实现 if (!value) return true console.log(value) const dateInList = value.split('-'); // 补充数组长度判断,避免split后长度不足3时报索引错误 if (dateInList.length < 3) return false const yearHasCorrectDigit = dateInList[0].length === 4; const monthAndDayHasCorrectDigit = dateInList[1].length == 2 && dateInList[2].length == 2; return yearHasCorrectDigit && monthAndDayHasCorrectDigit; } })
修正后的schema定义代码:
const schema = yup.object().shape({ dateOfBirth: dateFormatRequired(), // 如需必填可链式调用.required() gender: isRequiredOnly, }) schema .validateSync({/* 你的校验数据 */}, { abortEarly: false })
额外排查思路
如果修改后仍然存在阻断问题,可按以下方向排查:
- 给所有自定义test函数外层加try/catch,捕获异常并返回false,确认是否是其他隐藏异常导致的中断
- 单独校验
gender字段,确认isRequiredOnly校验逻辑本身没有抛出异常 - 升级Yup到最新稳定版,排除版本本身的bug
内容的提问来源于stack exchange,提问作者ey dee ey em
相关产品推荐
相关产品推荐

