Redux Saga发生错误时获取axios Response对象

时间:2018-07-22 10:17:32

标签: reactjs error-handling axios redux-saga

这对我来说是新的,我试图弄清楚当使用yield generator(redux-saga)发生axios错误时如何检索请求正文

这是我正在使用的一段代码:

function requestLogin(user: ILoginUserPayload) {
  const loginUrl = `${config.apiUrl}/auth/logIn`;
  return axios.post(loginUrl, user);
}

export default function* watchAuthAction(): IterableIterator<any> {
  while (true) {
    const { payload }: { payload: ILoginUserPayload} = yield take(TYPES.LOGIN_REQUEST);

    console.log(`Payload`, payload);
    try {
      const response = yield requestLogin(payload);
      console.log(`Response`, response);
    } catch (error) {
      // According to my debug, error.request contains all the axios info
      console.log(error.request.response);
      yield put({ type: TYPES.LOGIN_FAILURE, error: error.request.response.message });
    }
  }
}

我使用VSCode调试错误内容,发现其中包含axios请求信息(我是说,我99%确信axios会抛出错误,并且它来了)

我的身体反应如下:

{"message":"User doesn't exist","stack":"Error: User doesn't exist"}

所以我尝试通过以下方式获得它:

console.log(error.request.response.message);

但是它不起作用,也许我忘记了关于axios的东西...

有什么主意吗?

编辑:我实际上正在阅读此部分:https://github.com/axios/axios#handling-errors 但我仍然无法获取数据:/

3 个答案:

答案 0 :(得分:1)

您的代码似乎正确,对我来说唯一的不同是:

try {
    const response = yield call(apiCall, action.payload)
      yield put({ type: successReducer, payload: response });
  } catch(error) {
    // Construct an error message
    let errorMessage = error.response.status + ":"+ error.response.statusText;
    yield put({ type: failReducer, payload: {  message : errorMessage }});
  }

所以对我来说,区别似乎在于我改为访问error.response.status 错误。请求。响应

答案 1 :(得分:0)

所以这是我所期望的一个axios错误。

我只是按照文档获取数据:)

这是部分:

axios.get('/user/12345')
  .catch(function (error) {
    if (error.response) {
      // The request was made and the server responded with a status code
      // that falls out of the range of 2xx
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    } else if (error.request) {
      // The request was made but no response was received
      // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
      // http.ClientRequest in node.js
      console.log(error.request);
    } else {
      // Something happened in setting up the request that triggered an Error
      console.log('Error', error.message);
    }
    console.log(error.config);
  });

就我而言,我只需要使用以下信息即可获取消息:

error.response.data.message

答案 2 :(得分:0)

伙计,我花了好几个小时。

这对我有用:

console.log(error.response.data.message);

因此,在您的 error 对象中,有一个 response 对象,然后您可以访问 data 对象中的所有内容。

try {
  const response = yield requestLogin(payload);
  console.log(`Response`, response);
} catch (error) { 
  yield put({ type: TYPES.LOGIN_FAILURE, error: error.response.data.message });
}

您可以像这样在 catch 中调试它:

catch (error) {
    console.log('erro:', error.response.data.message) 
  }