javascript 当.required()为false时,Yup会在同一个属性上运行验证器

xvw2m8pv  于 2023-01-16  发布在  Java
关注(0)|答案(2)|浏览(144)
    • bounty将在3天后过期**。回答此问题可获得+50声望奖励。Thore希望引起更多人关注此问题。

我对yup的工作原理有点困惑。
我使用以下模式来验证寄存器

export const registerValidationSchema = yup.object().shape({
    first_name: yup.string().trim().required(),
    last_name: yup.string().trim().required(),
    date_of_birth: yup.date().required().test('DOB', 'You must be at least 18 to register', value => {
        return value.setFullYear(value.getFullYear() + 18) < Date.now()
    }),
    email: yup.email().trim().required()
});

当要验证的对象为以下对象时

const data = {
    email: "john.doe@company.com"
}

验证会崩溃,因为value未定义,函数value.setFullYear会失败。但是为什么呢?我假设yup会在.required()部分停止这一行,并转到下一个属性。
我知道这个问题可以通过在.test()中添加if(!value) return false;来解决,但是所需函数的意义何在?
来自yup文档:

    • 字符串。必需(消息?:弦|函数):架构**

与mixed()模式所需的相同,只是空字符串也被视为"缺少"值。

    • 混合。必填(消息?:弦|函数):架构**

将方案标记为required,这将不允许值为undefined或null。请注意,除非将方案标记为nullable(),否则null值将被视为类型错误,而不是缺少值。将方案标记为mixed()。nullable(). required()将null视为缺少值。
因此,我将其理解为undefinednull''值应在.required()规则上失败。

a11xaf1n

a11xaf1n1#

当需要更细粒度的控制时,我使用下面的yup.mixed结构。例如,当验证FileList时。希望它能让你更进一步。

date_of_birth: yup.mixed()
    .test(
        "required",
        "Date of birth is required",
        (dateOfBirth) => ... return true if dateOfBirth is not null/undefined and is a valid date, else false
    ).test(
        "DOB",
        "You must be at least 18 to register",
        (dateOfBirth) => ... do the above-eighteen-check and return true/false 
    )
hwazgwia

hwazgwia2#

代替email: yup.email().trim().required()
尝试email: yup.string().trim().email().required()
在github文档中找到

const registerValidationSchema = yup.object().shape({
  first_name: yup.string().trim().required(),
  last_name: yup.string().trim().required(),
  date_of_birth: yup.date().required().test('DOB', 'You must be at least 18 to register', value => {
    return value.setFullYear(value.getFullYear() + 18) < Date.now()
  }),
  // email: yup.email().trim().required
  // modified
  email: yup.string().trim().email().required()
})

const data = {
  first_name: "john",
  last_name: "deo",
  date_of_birth: "12-jan-2000",
  email: " john.doe@gamil.com "
}

// validating schema
registerValidationSchema.isValid(data)
  .then(r => console.log(r))
  .catch(e => console.log(e))

相关问题