Javascript 如何正确捕获axios get请求中的错误?

Javascript 如何正确捕获axios get请求中的错误?,javascript,reactjs,api,redux,axios,Javascript,Reactjs,Api,Redux,Axios,我使用openweathermapapi获取预测。应用程序基于ReactJS和Redux。我有一个捕获错误的问题。我想在数据库中不存在搜索到的城市时为用户创建警报。 因此,我的行动如下: export function fetchWeather (city) { const url = `${ROOT_URL}&q=${city}`; const request = axios.get(url); return (dispatch) => {

我使用
openweathermapapi
获取预测。应用程序基于ReactJS和Redux。我有一个捕获错误的问题。我想在数据库中不存在搜索到的城市时为用户创建警报。 因此,我的行动如下:

export function fetchWeather (city) {
    const url = `${ROOT_URL}&q=${city}`;
    const request = axios.get(url);

    return (dispatch) => {
        request
         .then(({data}) => {
            dispatch({type: FETCH_WEATHER, payload: data})
         })
         .catch((error) => { 
            dispatch({type: FETCH_WEATHER_ERROR, payload: error})
        });
    };
还有我的减速机:

import { FETCH_WEATHER, FETCH_WEATHER_ERROR } from '../actions/index';

export default function (state = [], action) {
    switch (action.type) {
    case FETCH_WEATHER:
     console.log(action.payload) //I receive object, so it's ok
        return [...state, action.payload];

    case FETCH_WEATHER_ERROR: 
     console.log(action.payload) // I receive just info in console "Error: Request failed with status code 404"
        return state;
    }
    return state;
}
所以,它可以正常工作,但我很好奇如何在错误部分获得适当的对象,以简单地显示带有消息信息的警报发生了什么错误。因为当我签入inspector选项卡(网络)时,有一个很好的对象作为响应:
{cod:“404”,消息:“未找到城市”}
,但在
控制台.log(action.payload)
中,我只有信息,没有对象,数组。。。为什么这些东西不同?如何获得正确的错误响应值以显示错误消息?

连接工作时,即使存在401不允许或404未找到,API似乎仍将始终返回200(成功)。在开发工具网络选项卡中查看以下url:

http://samples.openweathermap.org/data/2.5/weather?q=nomatterNoApiKey
所以任何陷入困境的都是实际的网络问题

request
.then((response) => {
  if(response.cod===200){
    dispatch({type: FETCH_WEATHER, payload: response.data});
  }else{
    dispatch({type: FETCH_WEATHER_ERROR, payload: response.message});
  }
})

您必须确保这是使用API的正确方式,并且仍然必须处理网络错误。

连接正常时,API似乎总是返回200(成功),即使存在不允许的401或未找到的404。在开发工具网络选项卡中查看以下url:

http://samples.openweathermap.org/data/2.5/weather?q=nomatterNoApiKey
所以任何陷入困境的都是实际的网络问题

request
.then((response) => {
  if(response.cod===200){
    dispatch({type: FETCH_WEATHER, payload: response.data});
  }else{
    dispatch({type: FETCH_WEATHER_ERROR, payload: response.message});
  }
})

您必须确保这是使用API的正确方式,并且仍然必须处理网络错误。

当您捕获到它时,您将无法获得已发送的json(您可以检查错误并查看是否存在任何错误)。如果请求正常返回(不进入catch),即使city不存在,那么您得到的json也没有
数据
成员(只有cod和message),当您捕获它时,您将不会得到已发送的json(您可以检查错误并查看是否有任何内容)。如果请求正常返回(不进入catch),即使city不存在,那么您得到的json没有
数据
成员(只有cod和message)