Автоматическое повторное подключение с использованием `firebase serve` на локальном хосте

#firebase

#firebase

Вопрос:

Я размещаю проект firebase на своем компьютере с помощью firebase serve . Когда мой Интернет отключается, я получаю сообщение об ошибке ниже, и программа завершает работу. Существует ли --option , который позволяет автоматически переподключаться или каким-либо образом перехватывать ошибку вручную и переподключаться? Я хочу, чтобы приложение продолжало попытки подключиться, пока мой Интернет не вернется в Сеть.

 >        throw er; // Unhandled 'error' event
>        ^
> 
>  Error: 14 UNAVAILABLE: Name resolution failed for target dns:firestore.googleapis.com:443
>      at Object.callErrorFromStatus (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrccall.js:30:26)
>      at Object.onReceiveStatus (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrcclient.js:328:49)
>      at Object.onReceiveStatus (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrcclient-interceptors.js:304:181)
>      at Http2CallStream.outputStatus (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrccall-stream.js:116:74)
>      at Http2CallStream.maybeOutputStatus (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrccall-stream.js:155:22)
>      at Http2CallStream.endCall (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrccall-stream.js:141:18)
>      at Http2CallStream.cancelWithStatus (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrccall-stream.js:450:14)
>      at ChannelImplementation.tryPick (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrcchannel.js:237:32)
>      at ChannelImplementation._startCallStream (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrcchannel.js:267:14)
>      at Http2CallStream.start (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrccall-stream.js:428:22)
>  Emitted 'error' event on ClientReadableStreamImpl instance at:
>      at Object.onReceiveStatus (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrcclient.js:328:28)
>      at Object.onReceiveStatus (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrcclient-interceptors.js:304:181)
>      [... lines matching original stack trace ...]
>      at Http2CallStream.start (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrccall-stream.js:428:22)
>      at BaseStreamingInterceptingCall.start (C:UsersTowerIdeaProjectsteam-up-serverfunctionsnode_modules@grpcgrpc-jsbuildsrcclient-interceptors.js:276:1
9) {
>    code: 14,
>    details: 'Name resolution failed for target dns:firestore.googleapis.com:443',
>    metadata: Metadata { internalRepr: Map {}, options: {} }
>  }
  

Ответ №1:

firebase serve не рекомендуется.

Попробуйте firebase emulators:start ; У меня не возникло никаких проблем с включением / выключением / подключением к Сети при его использовании.

Документы:https://firebase.google.com/docs/rules/emulator-setup


Но обратите внимание в сообщении об ошибке, что ошибка связана с выполняемым вами вызовом Google API.

Если вы вызываете онлайн-API вместо эмулируемого, само ваше приложение должно быть настроено на повторную попытку или обработку неудачных вызовов.

Некоторые аспекты firebase действительно можно эмулировать локально; опять же, смотрите документы, связанные выше.

Комментарии:

1. На самом деле это не устранило проблему. Я думал, что это так, потому что он эмулирует базу данных на моем локальном хосте. Когда я запускаю его таким образом, firebase emulators:start --only functions он по-прежнему выходит из строя без Интернета. При выполнении происходит сбой firestore.collection(...).then().catch() Есть подвох, но он все еще сбой.

2. Пожалуйста, смотрите 2-ю часть ответа о внешнем вызове API

3. Вызов API is выполняется, когда я вызываю функцию, подобную этой firestore().collection(...).get().then().catch() . .catch() В конце должно обработать ошибку, но она все еще выдает ошибку. Я также попытался обернуть все это в блок try / catch, но это все равно завершает работу программы.