【问题标题】:How to do I do server side validation using Formik and Yup?如何使用 Formik 和 Yup 进行服务器端验证?
【发布时间】:2020-07-05 10:20:20
【问题描述】:

我正在尝试验证注册表单上的电子邮件字段以检查它是否已存在。为此,我正在检查服务器上正在运行的返回 true 和 false 的 GET 请求。

这是我对该字段的验证架构:

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
        }
    })
})

【问题讨论】:

    标签: javascript node.js axios formik yup


    【解决方案1】:

    我解决了我的验证问题,我执行了以下操作:

     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 请求,否则请求的正文将是空的。

    【讨论】:

      【解决方案2】:

      我注意到您在问题中使用了 async/await,但您的回答使用了 Promise。我更喜欢 async/await,最初认为 Yup 的测试功能不支持它,因为如果你的解决方案,但 Yup 确实支持 async/await!这是我的代码示例,供任何想要示例的人使用。文档中也有一些示例:https://github.com/jquense/yup#mixedtestname-string-message-string--function-test-function-schema

      username: Yup.string()
            .min(2, 'Too short, minimum 2 characters')
            .max(50, 'Too long, maximum 50 characters')
            .required('Required')
            .test(
              'username-backend-validation',  // Name
              'Username taken',               // Msg
              async (username) => {
                // Res from backend will be flag at res.data.success, true for 
                // username good, false otherwise
                const { data: { success } } = await axios.post(
                  "http://localhost:3001/api/users/register/validate-username", 
                  { username: username }
                );
      
                return success
              }
            )
      

      【讨论】:

        猜你喜欢
        • 2019-12-26
        • 2019-09-12
        • 2019-10-09
        • 2021-06-27
        • 1970-01-01
        • 2020-01-01
        • 1970-01-01
        • 2019-09-29
        • 2020-05-10
        相关资源
        最近更新 更多