axios catch 没有捕捉到错误

axios catch doesn't catch error

我正在使用 axios 0.17.0 和以下代码:

this.props.userSignupRequest(this.state)
  .then( res => { console.log(res.data) } )
  .catch( err => { this.setState({ errors: err.response }) } )

当用户注册验证未通过时,服务器设置为 return a 400。这也显示在控制台中:POST 400 (Bad Request),但未执行 setState。这是为什么?我也试过 console.log(err) 但什么也没有。

POST 400 (Bad Request)不是错误,是响应不成功。 catch 当请求出现错误时触发。

如果您想捕获 400 或类似的 HTTP 错误,您需要检查 status

例子

this.props.userSignupRequest(this.state)
  .then( res => { console.log(res.status) } )
  .catch( err => { this.setState({ errors: err.response }) } )

可能存在一些问题,我们可能需要查看您的更多代码才能确定。

Axios 0.17.0 将在 400 响应状态上抛出错误。下面的演示显示了这一点。

意外行为可能是由于 setState() 的异步行为造成的。如果您在调用 setState() 后立即尝试 console.log 状态,那是行不通的。您需要使用 setState 回调。

const signinRequest = () => {
  return axios.post('https://httpbin.org/status/400');
}   
  
class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      errors: null
    }
  }
  
  handleSignin = () => {
    this.props.userSigninRequest()
      .then(result => {
        console.log(result.status);
      })
      .catch(error => {
        this.setState({
          errors: error.response.status
        }, () => {
          console.error(this.state.errors);
        });
      });
  }
  
  render() {
    return (
      <div>
         <button onClick={this.handleSignin}>Signin</button>
        {this.state.errors}
      </div>
    )
  }
}

ReactDOM.render(<App userSigninRequest={signinRequest} />, document.getElementById("app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.17.0/axios.js"></script>

<div id="app"></div>