reactjs - 使用自定义Axios和redux-saga处理错误

标签 reactjs error-handling axios interceptor redux-saga

我的React App中有以下管道

saga.js:

function* handleGetTrack(action: ReturnType<typeof selectTrack>) {
  try {
    const getTrackResponse = yield httpGetTrack(action.payload)
    yield console.log(getTrackResponse)

     getTrackResponse.status === 200
       ? yield put(trackSelected(getTrackResponse.data))
       : yield put(selectTrackError('Track Not Found (Get)'))
  } catch (err) {
    if (err instanceof Error && err.stack) {
      yield put(selectTrackError(err.stack))
    } else {
      yield put(selectTrackError('An unknown error occured.'))
    }
  }
}

Api.js
export function httpGetTrack(trackId) {
  return customAxios.get(`${URL}/tracks/${trackId}`)
}

customAxios.js:
export const customAxios = axios.create({
  baseURL: process.env.REACT_APP_API_ENDPOINT,
  timeout: 10000,
})
customAxios.interceptors.response.use(
  function(response) {
    return response
  },

  function(error) {
    const errorResponse = error.response
    if (isTokenExpiredError(errorResponse)) {
      return resetTokenAndReattemptRequest(error)
    }
    return error.response
  }
)


这样,一切正常,实际上,在我的saga.js中,我可以使console.log(getTrackResponse)很好地打印错误,

但是在Axios文档中,它说tu使用return Promise.reject(error)而不是return error.response
这是为什么 ??我做得好还是做错了?

最佳答案

您是否尝试过使用call效果?例如:

import { call } from 'redux-saga/effects';

...

const getTrackResponse = yield call(httpGetTrack, action.payload);

...

定义拦截器时,还应该遵循Axios文档
function(error) {
    const errorResponse = error.response
    ...
    return Promise.reject(error.response);
}

关于reactjs - 使用自定义Axios和redux-saga处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60951108/

相关文章:

reactjs - React SSR,处理页面滚动位置的正确方法

javascript - 嵌套状态对象中的回调

c# - 在 C# 中从 SQL 捕获 REFERENCE 约束异常

ios - 核心数据: bundle.main.url Thread 1 fatal error

reactjs - 如何将使用钩子(Hook)的函数包装在 useEffect 中?

javascript - react native 选择器 : Filter Specific and Duplicate Item

reactjs - 在渲染 react 钩子(Hook)之前等待 API 调用数据

reactjs - 如何从 Sharepoint 在线 SPFx Web 部件使用 Azure 认知搜索

mysql - 尝试处理数据库登录表单中的错误时结果不同

javascript - 是否可以通过数组进行映射并从服务器获取从映射数组中获取的每个项目的数据?