javascript - React Formik 没有正确处理错误

标签 javascript reactjs promise

我正在使用基本的 Formik 模板来处理登录表单。

onSubmit={(
                    values,
                    { setSubmitting, setErrors /* setValues and other goodies */ }
                  ) => {
                      props.logMeIn(values);
                    // LoginToSystem(values).then( 
                    //   user => {
                    //     setSubmitting(false); 

                    //     // do whatevs...
                    //     // props.updateUser(user)
                    //   },
                    //   errors => {
                    //     setSubmitting(false);
                    //     // Maybe transform your API's errors into the same shape as Formik's
                    //     //setErrors(transformMyApiErrors(errors));
                    //     console.log(errors);
                    //   }
                    // );
                }}

这个问题在onSubmit 部分;演示代码被注释掉了,但它使用了一个似乎是 promise 的 LoginToSystem 函数。我无法弄清楚这个功能对我来说是什么。我处理此问题的函数是 props.logMeIn() - 它也无法按预期工作

如果登录成功,目前会正常运行,一切正常。但是,如果登录失败(404、401 等),表单将保留在那里,并且 setSubmitting 日志将保留在那里,因此 Submit 变灰但什么也没做。

如果我尝试用我的函数替换 LoginToSystem,我会在 .then 上收到一个错误,我无法执行 .thenundefined 上。

我想知道这是否是因为我的函数没有像 Promise 那样设置?

  loginClickHandler = (user) => {
    let userObj = {
      email: user.email,
      password: user.password
    }
    axios.post('api/v1/auth/sign_in', userObj)
        .then((res) => {
          console.log(res.headers);
          let loggedInUser = {
           'access_token': res.headers['access-token'],
           'client': res.headers['client'],
           'uid':res.headers['uid'],
           'signedIn': true
          };
          this.setState({
            user: loggedInUser
          })     
          this.props.retrieve(user.email);
        })
        .catch((err) => {
            console.log(err);
            return err
        })

  };

我的函数确实在 .then/.catch 上正确捕获(感谢 axios),但也许我应该修改它们以提供回调以便 onSubmit 可以正确触发?

最佳答案

在一些指导下,我能够更简单地解决这个问题。 Axios native 返回一个“ promise ”,所以我只需要确保函数的结果最终是 axios 的方法。

 loginClickHandler = (user) => {
        let userObj = {
            email: user.email,
            password: user.password
        }
        const request = axios.post('api/v1/auth/sign_in', userObj);

        request.then((res) => {
            console.log(res.headers);
            let loggedInUser = {
                'access_token': res.headers['access-token'],
                'client': res.headers['client'],
                'uid': res.headers['uid'],
                'signedIn': true
            };
            this.setState({user: loggedInUser, auth: true, anchorEl: null})
        }).catch((err) => {
            console.log(err);
            // setErrors({ test: 'This was an error' })
        })
        return request;
    };

关于javascript - React Formik 没有正确处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49682072/

相关文章:

javascript - 多次执行 angular.forEach 后的函数

javascript - 填充/修改 Smartsheet 中 "PICK LIST"列类型的选项

javascript - 处理打印对话框的 'Close'事件

javascript - 另一个模态内的 Bootstrap 模态 - 关闭按钮问题

javascript - 一个 Javascript 库使用两个 CDN 不好吗?

reactjs - 适用于 Internet Explorer 9 的 React、Webpack 和 Babel

reactjs - Typescript Webpack React 编译导致只读文件系统错误,但开发服务器工作正常

javascript - 多个 Promise 并行运行,$q.all 需要链接吗?

reactjs - 错误 : getStaticPaths is required for dynamic SSG pages and is missing for "xxx". NextJS

node.js - Promise 超时后停止执行