我的 Redux 处理来自 axios 的错误应该使用不同的操作还是使用附加数据的相同操作?

Posted

技术标签:

【中文标题】我的 Redux 处理来自 axios 的错误应该使用不同的操作还是使用附加数据的相同操作?【英文标题】:Should my Redux handling of errors from axios use different actions or the same action with additional data attached? 【发布时间】:2020-08-22 09:43:34 【问题描述】:

我正在使用带有 redux 的 Axios 和 Thunk 中间件调用 api,以获取事务列表。 API 返回的任何错误也会返回一个错误对象。该错误对象的格式为


  "error": 
    "id": "string",
    "name": "string",
    "detail": "string"
  

如果我收到 400,这是一些一般性错误,但 404 表示未找到交易。我想知道的是逻辑应该在哪里解析响应?我应该在动作创建者中解析响应,并发送单独的动作,看起来像这样:

catch (e) 
  if (e.response) 
    if (e.response.status === 400) 
      //failed for some reason
      dispatch(type: TRANSACTION_REQUEST_ERROR, data: e.response.data)
    
    if(e.response.status === 404) 
      //no transactions, no problem. 
      dispatch(type: NO_TRANSACTIONS_FOUND, data: e.response.data)
    
  

或者,我是否应该使用相同的操作并包含reducer 需要决定如何更新状态的任何响应信息,并将该逻辑委托给reducer?

catch (e) 
  if (e.response) 
    dispatch(type: TRANSACTION_REQUEST_ERROR, data: e.response.data)
  

//减速器

switch(action.type) 
  case TRANSACTION_REQUEST_ERROR:
   if(action.data.error.id === 'some id)
    //update some state
   else
     //do something else

或者,是六分之一,六分之一?

【问题讨论】:

我认为这是个人喜好问题,但在我看来,处理此问题的“Redux 方式”将在 reducer 中。动作创建者/thunk 应该包含尽可能少的业务逻辑。 reducer 应该是主要的“事实来源”,而不是单一的事实来源 【参考方案1】:

我将只使用一种操作来处理减速器中的错误和处理情况。这确保了应用程序中的每个请求都是同构的,并且只有 3 个操作 _REQUEST_SUCCESS_ERROR。并且更容易与redux-requests 或其他中间件集成。

【讨论】:

以上是关于我的 Redux 处理来自 axios 的错误应该使用不同的操作还是使用附加数据的相同操作?的主要内容,如果未能解决你的问题,请参考以下文章

处理 axios react-redux 应用程序中的 401 未授权错误

使用 Axios 在 Redux 中处理 api 调用

React Redux Axios:POST 请求未收到来自 redux 状态的凭据

为啥 axios .catch() 在 redux 中间件中捕获 javascript 错误?

如何修复来自 Axios 的随机 http 请求(404 响应)

使用 axios 处理来自异步等待语法的错误