Yup包abortEarly参数未按预期工作问题咨询
问题原因分析
你遇到的问题核心是对Yup的lowercase()方法作用理解有误:
lowercase()本质是值转换工具,而非验证规则。它的默认行为是将输入字符串转为小写后返回;当开启strict: true时,它只会跳过转换操作,并不会自动验证输入值是否已经是小写格式。因此你的name字段并没有触发验证错误。- 代码中第一个真正触发的验证错误来自
age字段:输入的是字符串'30',但schema要求是数字类型,这才是abortEarly: true时返回的第一个错误,完全符合Yup的预期逻辑。
实现预期效果的方法
要验证name必须是小写格式,需要使用专门的验证规则,推荐两种方式:
方式1:用matches()匹配正则表达式
通过正则匹配全小写字符串,自定义错误提示:
const employeeSchema = yup.object().shape({ name: yup.string().required().matches(/^[a-z\s]+$/, 'name必须为小写'), age: yup.number().positive().integer().required(), email: yup.string().email().required(), department: yup.string().required(), });
方式2:用test()自定义验证逻辑
手动判断输入值是否与小写转换后的值一致,灵活性更高:
const employeeSchema = yup.object().shape({ name: yup.string().required().test( 'is-lowercase', 'name必须为小写', (value) => value === value.toLowerCase() ), age: yup.number().positive().integer().required(), email: yup.string().email().required(), department: yup.string().required(), });
修改后的完整示例
const yup = require('yup'); const employeeSchema = yup.object().shape({ name: yup.string().required().matches(/^[a-z\s]+$/, 'name必须为小写'), age: yup.number().positive().integer().required(), email: yup.string().email().required(), department: yup.string().required(), }); const employeeData = { name: 'john Doe', age: '30', email: 'john.doe@example.com', department:'cse' }; employeeSchema.validate(employeeData, { strict:true, abortEarly:true }) .then(validatedData => { console.log('Validation successful:', validatedData); }) .catch(error => { console.error('Validation error:', error.message); });
运行这段代码会返回第一个错误:Validation error: name必须为小写,完全符合你想要的效果。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

