Есть ли лучший, более чистый способ написания этого валидатора схемы Yup (используется компонентом React Formik)? - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу вызывать конечную точку службы (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')
    })

Кажется, что проверка строки дважды является излишней ... но если яоставьте валидацию, тогда все три валидации запустятся.

Я использую документацию, найденную здесь: Yup github README.md

в разделе mixed.test говорится:

Чтобы разрешить асинхронную пользовательскую проверку, все (или нет) тесты выполняются асинхронно. Следствием этого является то, что порядок выполнения теста не может быть гарантирован.

Поэтому я пытаюсь гарантировать, что я не буду делать дорогие вызовы API, если мне действительно не нужно ...

1 Ответ

0 голосов
/ 01 октября 2019

Я реорганизовал решение выше, и оно, кажется, работает нормально и делает то, что я хочу.

    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')
    });
...