Как мне выполнить проверку на стороне сервера, используя Formik и Yup? - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь проверить поле электронной почты в форме регистрации, чтобы проверить, существует ли оно уже. Для этого я проверяю выполнение GET-запроса на сервере, который возвращает true и false.

Это моя схема проверки для поля:

validationSchema={
    yup.object().shape({
        registrationEmail: yup.string().email('Invalid email').test('Unique Email','Email already in use', async (value) => {axios.get('http://localhost:5000/users/register', value).catch(err => console.log(err)) })
    })
}

Проблема, похоже, что поле значений пустое. Как передать значение из поля Formik в мою функцию?

РЕДАКТИРОВАТЬ: удалось отправить значение с помощью следующего

registrationEmail: yup.string().email('Invalid email').test('Unique Email','Email already in use', function(value){return new Promise((resolve, reject) => {axios.get('http://localhost:5000/users/register', value)})})

У меня все еще возникают проблемы с возвратом ответа, вот что маршрут выглядит как

router.get('/register', (req, res) => {
    User.findOne({email: req.body.email}).then(user => {
        if(user){
            return true
        }else{
            return false
        }
    })
})

1 Ответ

0 голосов
/ 25 марта 2020

Я решил свою проблему для проверки Я сделал следующее:

 registrationEmail: yup.string().email('Invalid email')
                        .test('Unique Email','Email already in use', 
                            function(value){return new Promise((resolve, reject) => {
                                axios.post('http://localhost:5000/users/register/validEmail', {'email': value})
                                .then(res => {if(res.data.msg === 'Username already been taken'){resolve(false)} resolve(true)})
                            })}
                        )

Для маршрута:

router.post('/register/validEmail', (req, res) => {
    console.log('Request: ', req.body)
    User.findOne({email: req.body.email}).then(user => {
        if(user){
            console.log({ msg:"Username already been taken" })
            return res.json({ msg:"Username already been taken" })
        }

        console.log({ msg: "Username available." })
        return res.json({ msg: "Username available." })

    }).catch((err)=>{
        console.error(err);
        res.status(400).json('Error: ' + err)
    })
})

Оказывается, мне пришлось использовать запрос POST или тело запрос будет пустым.

...