每个 axios 请求在 react-redux 应用程序中触发两次?

Posted

技术标签:

【中文标题】每个 axios 请求在 react-redux 应用程序中触发两次?【英文标题】:Every axios request firing twice in react-redux app? 【发布时间】:2020-05-04 08:42:55 【问题描述】:

有很多类似的问题,但对我没有任何帮助。每个 Axios 请求都会在我的 react redux 节点应用程序中触发两次。我正在使用 node 的 express 框架。如果我以登录页面为例,那么 Action 将从登录页面调度,例如:

import React,  useState  from "react";
import  connect  from "react-redux";
import  Link, Redirect  from "react-router-dom";
import  login  from "../../actions/auth";
import PropTypes from "prop-types";

const Login = ( login, isAuthenticated ) => 
  const [formData, setFormData] = useState(
    email: "",
    password: ""
  );

  const  email, password  = formData;
  const onChange = e =>
    setFormData( ...formData, [e.target.name]: e.target.value );

  const onSubmit = async e => 
    e.preventDefault();
    login( email, password ); // this is action
  ;
  //redirect if login
  if (isAuthenticated) 
    return <Redirect to="/dashboard" />;
  
  return (
    <section className="container">
      <h1 className="large text-primary">Sign In</h1>
      <p className="lead">
        <i class="fa fa-user" aria-hidden="true"></i>Sign in your Account
      </p>
      <form className="form" onSubmit=e => onSubmit(e)>
        <div className="form-group">
          <input
            type="email"
            placeholder="Email Address"
            name="email"
            value=email
            onChange=e => onChange(e)
            required
          />
        </div>
        <div className="form-group">
          <input
            type="password"
            placeholder="Password"
            name="password"
            minLength="6"
            value=password
            onChange=e => onChange(e)
            required
          />
        </div>
        <input type="submit" className="btn btn-primary" value="Login" />
      </form>
      <p className="my-1">
        don't have an account? <Link to="/register">Sign Up</Link>
      </p>
    </section>
  );
;

Login.propTypes = 
  login: PropTypes.func.isRequired,
  isAuthenticated: PropTypes.bool
;

const mapStateToProps = state => (
  isAuthenticated: state.auth.isAuthenticated
);

export default connect(mapStateToProps,  login )(Login);

而用户操作就像

export const login = ( email, password ) => async dispatch => 
  const config = 
    headers: 
      "Content-Type": "application/json"
    
  ;
  const body = JSON.stringify( email, password );
  var res = "";
  try 
    //console.log('LOgin called'+ new Date());
    res = await axios.post(baseURL + "/api/users/login", body, config);
    //  console.log(res.data.token);

    //dispatch(setAlert('user login','primary'));
    const  token  = res.data.token;
    // Set token to ls
    localStorage.setItem("token", token);
    dispatch(
      type: LOGIN_SUCCESS,
      payload: res.data
    );

    dispatch(loadUser());
   catch (err) 
    const errors = err.response.data.errors;

    if (errors) 
      errors.forEach(error => dispatch(setAlert(error.msg, "danger")));
    

    dispatch(
      type: LOGIN_FAIL,
      payload: res.data
    );
  
;

当我点击login 然后我登录但请求在api/users/login 发送了两次,但为什么? 我找不到原因,它与我的应用程序中的所有 axios 请求有关。 请求屏幕在这里

【问题讨论】:

您是如何检查请求执行了两次的? 在跨域情况下,您可能会看到额外的 OPTION 请求。 @ChristiaanWesterbeek 你是对的,但那是什么? 【参考方案1】:

对于 Axios 发出的每个请求,您都会看到一个额外的 OPTION 请求。额外的OPTION 请求由您的浏览器执行,因为它检测到跨域。以下是执行额外 OPTION 请求的原因和方式:Why is an OPTIONS request sent and can I disable it?

【讨论】:

以上是关于每个 axios 请求在 react-redux 应用程序中触发两次?的主要内容,如果未能解决你的问题,请参考以下文章

包含 axios GET 调用的 React-Redux 应用程序测试操作创建者

使用 axios 获取 400 错误错误请求

如何在客户端处理 CORS 错误(React-Redux-Axios)

处理 axios react-redux 应用程序中的 401 未授权错误

axios 不会将 post 数据发送到后端

Axios 承诺解决飞行前请求响应,这使得关联的 GET 与应用程序的其余部分无序执行