Ошибка, генерируемая Firebase, перехватывается в then () действия redux-thunk - PullRequest
0 голосов
/ 07 марта 2020

Firebase выдает ошибку, если запрос обрабатывается слишком долго из-за медленных rnet соединений. Вот ошибка:

@ firebase / firestore: Firestore (7.9.2): Не удалось связаться с бэкэндом Cloud Firestore. Соединение не удалось 1 раз. Самая последняя ошибка: FirebaseError: [code = unavailable]: операция не может быть завершена. Обычно это указывает на то, что в данный момент ваше устройство не имеет исправного соединения Inte rnet. Клиент будет работать в автономном режиме до тех пор, пока не сможет успешно подключиться к бэкэнду.

Я столкнулся с странным поведением с избыточными значениями при попытке отловить эту ошибку. Моя функция api смогла перехватить ошибку firebase в своем блоке catch(), но не была поймана в блоке catch() в действии thunk. Вот некоторый псевдокод, чтобы проиллюстрировать это лучше:

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))
  })
}

Я создал песочницу с кодом для воспроизведения ошибки. Не стесняйтесь поиграть с кодом. Когда вы go отключены от сети, когда приложение извлекает данные, возникает ошибка firebase, и консоль покажет, что API-интерфейс сервера перехватил ошибку, но не удалось выполнить действие thunk. Я не уверен, является ли это ошибкой с моей стороны или ограничением библиотеки redux-thunk или библиотеки firebase.

Вопрос: Как мне справиться с этой ошибкой, чтобы мое действие thunk не отправляло ошибку как успешную?

Любая помощь будет приветствоваться.

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Это сообщение просто уведомление для вас. Это не совсем ошибка, и вы не можете ее поймать. Firestore не рассматривает проблемы сети как ошибки. Он просто постоянно повторяется в фоновом режиме.

0 голосов
/ 16 марта 2020

Вот решение на случай, если кто-нибудь столкнется с этой ошибкой.

Самое простое решение - удалить блок catch() из функции api и перехватить ошибки в функции вызывающей стороны. Исходя из примера кода, приведенного в вопросе, единственной модификацией будет файл api. js:

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

Во время тестирования, если ошибка генерируется firebase, ударил блок catch() блока, который отправляет действие ошибки.

...