无法在 axios .catch 中获取错误消息

sah*_*555 4 node.js express react-native axios

我使用的是 React-native 版本 0.62.2,Axios 版本 ^0.19.2 Express 版本 ^4.17.1

在快递中我使用

 if (!user) {
  return res.status(404).send({email:'email not exist'})
}
Run Code Online (Sandbox Code Playgroud)

但问题是在使用 axios 的前端(react-native)端,我在 catch 中得到以下信息: [Error: Request failed with status code 404] 而不是 err.response

使用 axios 在 React-Native 端编写代码

   export const onLogin = userData => {
  return dispatch => {
    dispatch(onFetching());
    Axios.post(`${Routes.login}`, userData)
      .then(res => {
       console.log(res)
      })
      .catch(err => {
        console.log(err)
      });
  };
};
Run Code Online (Sandbox Code Playgroud)

那么我在这里做错了什么吗?

您可以用一个最小的工作示例来更新您的帖子来证明您的问题吗

import axios from 'axios'



const instance = axios.create({
    timeout: 1000,
    validateStatus: function validateStatus(status) {
        let default = status >= 200 && status < 300
        let extra = status == 404
        return default || extra
    }
});


export default instance;
Run Code Online (Sandbox Code Playgroud)

那么究竟发生了什么,听听他的

这张图片以完美的方式展示了它

Gje*_*riu 5

但问题是在使用 axios 的前端(react-native)端,我在 catch 中得到以下信息: [Error: Request failed with status code 404] 而不是 err.response

这是设计使然,当响应的状态代码默认不在 200-299 范围内时,它会抛出错误。

您可以通过覆盖来更改此默认validateStatusaxios.create。例如接受默认允许的状态代码范围 + 404:

const instance = axios.create({
    ...
    validateStatus: function validateStatus(status) {
        let default = status >= 200 && status < 300;
        let extra = status == 404
        return default || extra
    }
});
Run Code Online (Sandbox Code Playgroud)

那么即使状态码是404,axios也不会抛出错误。

但不建议这样做,状态代码不在 2xx 中意味着将作为错误处理。要获得响应,您应该使用

  • .then(err => console.log(err.response),在你的情况下将是 {email:'email not exist'}

axios默认的validateStatus:

  validateStatus: function validateStatus(status) {
    return status >= 200 && status < 300;
  }
Run Code Online (Sandbox Code Playgroud)

axios错误属性:错误、配置、代码、请求、响应

您可以在此处检查 axios 的默认值: https: //github.com/axios/axios/blob/6642ca9aa1efae47b1a9d3ce3adc98416318661c/lib/defaults.js#L79

创建错误:https ://github.com/axios/axios/blob/master/lib/core/createError.js

更新2:

但是在react-native方面应该在哪里使用这个实例变量呢?

是的,您可以将其放入单独的文件中,然后导入。然后,每当您想要使用此处配置的选项使用 axios 时,您都可以导入已定义的实例,而不是每次都将多个选项传递给 axios。

例如:

utils/axios.js

const instance = axios.create({
    ...
    validateStatus: function validateStatus(status) {
        let default_ = status >= 200 && status < 300;
        let extra = status == 404
        return default_ || extra
    }
});
export default instance;
Run Code Online (Sandbox Code Playgroud)

然后不要使用: import axios from "axios";使用import axios from "./utils/axios";