有没有更好、更干净的方法来编写这个 Yup 模式验证器(由 React Formik 组件使用)?



如果电子邮件值是电子邮件格式的字符串,我只想调用服务端点(db.checkEmail(。

const yupSchema = Yup.object().shape({
email: Yup.string()
.email()
.required('Required')
.test('alreadyUsed', 'Not Available', async (value) => {
const result = await Yup.string()
.email()
.required('Required')
.validate(value)
.then((email) => db.checkEmail({email}));
return result.data.count === 0;
})
,
password: Yup.string()
.required('Required')
})

似乎检查两次字符串是多余的...但是如果我省略验证,那么所有三个验证都会运行。

我正在使用此处找到的文档: 是的,github README.md

在 mixed.test 部分下,它说:

为了允许异步自定义验证,所有(或不(测试都是异步运行的。这样做的结果是无法保证测试执行顺序。

所以我试图保证我不会进行昂贵的 api 调用,除非我真的需要......

我重构了上面的解决方案,它似乎工作正常并完成了我想要它做的事情。

const yupSchema = Yup.object().shape({
email: Yup.string()
.email()
.required('Required')
.test('alreadyUsed', 'Not Available', (value) => Yup.string()
.email()
.required('Required')
.validate(value)
.then((email) => db.checkEmail({email}))
.then(({data:{count}}) => count === 0)),
password: Yup.string()
.required('Required')
});

最新更新