在 react-redux 应用程序中使用默认错误处理管理 API 调用

Posted

技术标签:

【中文标题】在 react-redux 应用程序中使用默认错误处理管理 API 调用【英文标题】:Managing API calls with default error handling in react-redux application 【发布时间】:2017-11-28 03:00:05 【问题描述】:

我已经完成了我的应用程序,现在我正在为每个异步操作集成真正的 api 调用。我使用redux-thunk,它从axios 实例返回一个promise。

目前,我在我的行动中重复了很多相同的逻辑,我确信我错过了一些东西。

API 响应示例


    "ok": true,
    "warnings": [],
    "errors": [],
    "response": /* stuff */

这个想法是,如果 axios 调用失败(所以另一个响应状态然后是 2xx),我需要相同的错误处理。此外,当 api 响应返回 "ok": false 时,我也需要做同样的事情。

最好我想发送一个向用户显示通知的操作,以便他们也知道何时出现问题。除此之外,我想记录 api 响应的 warningserror 实体。这主要是因为我将使用sentry进行监控。

关于如何在不使用 .catch() 的情况下对我的任何动作创建者中的每个 api 调用使用相同逻辑的任何想法?

我曾考虑过使用axiosonError,但据我所知,这无法调度操作。

【问题讨论】:

【参考方案1】:

您可以使用response interceptor 来调度适当的操作。创建商店后将它们连接起来

const store = createStore(...)

axios.interceptors.response.use((response) => 
  if (!response.data.ok) 
    store.dispatch( type: "RESPONSE_NOT_OK", response 
  

  return response
, (error) => 
  store.dispatch( type: "RESPONSE_HAD_ERROR", error 

  return Promise.reject(error)
)

显然,您可以随心所欲地处理响应,这只是为了演示目的。

【讨论】:

谢谢!有什么方法可以将 api 调用特定的参数传递给拦截器,以便在事情变坏或不坏的时候? 你能给我一个 api 调用特定参数的例子吗?回调中的responseerror 参数都有一个request 字段,它是生成响应的请求。 Here is the docs on what is available on that. 基本上我想为我的拦截器提供一个“消息”参数,以便拦截器可以将它传递给创建向用户显示消息的通知的操作。因此,对于登录,它可能是“无法登录”,但对于创建帖子,它可能是“无法创建帖子”等。希望这很清楚:) 我没有尝试过,但我怀疑添加到request config(例如axios.get('/example', myValue: "test" ))的任何附加值都可以在请求字段(例如response.request.myValue)的拦截中访问。试一试,告诉我进展如何。

以上是关于在 react-redux 应用程序中使用默认错误处理管理 API 调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-routerv4 从 react-redux 应用程序中的状态渲染组件时出现 404 错误?

错误:无法解析模块 react-redux/native

无论在寄存器中输入啥,使用 react-redux 和 jwt 都会出现“请输入所有字段错误”

处理 CRUD 应用程序中的重复值错误(react-redux + express-mongoose)

如何使用 react-redux 将错误 500 全局重定向到页面

react-redux 类型文件中的 TypeScript 错误