【问题标题】:Error thrown by Firebase is caught in then() of redux-thunk actionFirebase 抛出的错误被 redux-thunk 操作的 then() 捕获
【发布时间】:2020-06-19 17:06:42
【问题描述】:

如果请求由于互联网连接速度太慢而需要很长时间才能解决,Firebase 会发出错误消息。这是错误:

@firebase/firestore:Firestore (7.9.2):无法访问 Cloud Firestore 后端。连接失败 1 次。最近的错误:FirebaseError:[code=unavailable]:操作无法完成 这通常表明您的设备目前没有健康的互联网连接。客户端将在离线模式下运行,直到能够成功连接到后端。

在尝试捕获此错误时,我遇到了 redux-thunks 的奇怪行为。我的 api 函数能够在其 catch() 块中捕获 firebase 错误,但在 thunk 操作中未在 catch() 块中捕获。这里有一些伪代码可以更好地说明这一点:

api.js

getDoc () {
  return firebase.firestore().doc().get().then(result => {
    return result
  }).catch(error => {
    //error caught here
    console.log(error)
  })
}

thunks.js

action () {
  api.getDoc().then(result => {
    //result contains the error
    dispatch(success(result));
  })
  .catch(error => {
    //not being reached
    dispatch(failed(error))
  })
}

我创建了一个code sandbox 来重现错误。随意玩弄代码。当您在应用程序获取数据时离线时,将引发 firebase 错误,并且控制台将显示后端 api 捕获了错误但 thunk 操作未能这样做。 我不确定这是我的错误还是 redux-thunk 库或 firebase 库的限制。

问题:如何处理此错误,以便我的 thunk 操作不会将错误发送为成功?

我们将热烈欢迎任何帮助。

【问题讨论】:

    标签: reactjs firebase redux react-redux react-thunk


    【解决方案1】:

    该消息只是给您的通知。这不是一个真正的错误,你无法捕捉到它。 Firestore 不会将网络问题视为错误。它只是在后台不断重试。

    【讨论】:

    • 从我链接的沙箱开始,当我离线时,会引发错误,但如果我重新上线,我没有迹象表明 firebase 正在后台重试请求。我遇到的主要问题是thunk 动作。由于触发了 thunk 的 then() 块,通常包含 dispatch(success),因此在 then() 块中添加代码以检查错误对我来说似乎违反直觉。当 firebase-retry 成功时,有没有办法可以执行代码?如果我无法捕捉到该错误,您能否建议我应该使用 redux-thunks 来处理这种情况的工作流程?
    • 不,您无法判断 Firestore 是否正在重试任何内容。查询通常只有在违反安全规则或超出某些限制时才会失败。
    • 有什么方法可以减少重试限制?目前,如果在离线模式下执行,某些 Firestore 请求似乎需要几分钟才能引发连接/身份验证错误。
    【解决方案2】:

    如果有人遇到此错误,这里有一个解决方案。

    最简单的解决方案是从 api 函数中删除 catch() 块并在调用者函数中捕获错误。根据问题中提供的示例代码,唯一的修改是 api.js 文件:

    getDoc () {
      return firebase.firestore().doc().get().then(result => {
        return result
      })
    }
    

    在测试时,如果错误被 firebase 抛出,thunk 的 catch() 块会被命中,从而调度错误操作。

    【讨论】:

      猜你喜欢
      • 2018-10-25
      • 2023-03-28
      • 2018-03-20
      • 2017-01-12
      • 2019-01-29
      • 1970-01-01
      • 2023-02-06
      • 2017-09-26
      • 1970-01-01
      相关资源
      最近更新 更多