Не удалось получить доступ к бэкэнду Cloud Firestore, когда вкладка браузера была неактивной (AngularFire) - PullRequest
0 голосов
/ 01 мая 2020

В моем приложении Angular есть домашний компонент, который загружает содержимое профиля из Firestore через предоставленный URL-адрес (например, mypage.com/username ищет профиль с именем «username»). Теперь я думал, что это работает нормально, но заметил очень странное поведение:

  • загрузка профиля в активной вкладке (то есть пользователь в данный момент находится на этой вкладке) всегда загружает профиль
  • открытие профиля в новой, в настоящее время неактивной вкладке (то есть пользователь в настоящее время все еще открыл другую вкладку) и возможность полной загрузки вкладки также работает
  • открытие профиля в новой вкладке и переключение на него, пока это при продолжающейся загрузке выдается следующая ошибка: Не удалось связаться с бэкэндом Firestore. Сервер не ответил в течение 10 секунд ...

В последнем случае Firestore выдает ошибку, а запрос просто возвращает пустой массив. В этот момент я обычно показываю сообщение 404, потому что я предполагаю, что профиль не может быть найден (хотя в этом случае он существует). Если эта ошибка возникает, запрос Firestore все еще возвращает объект результата, когда вкладка становится активной (пользователь переключается на эту вкладку), но имейте в виду, что это происходит ПОСЛЕ того, как он уже выдал ошибку и возвратил пустой массив (и мои действия (показать 404) ) основаны на первом результате)

Я использую @ angular / fire 6.0.0, но такое поведение также существует в предыдущих версиях, таких как 5.2.3.

app-routing.module.ts

const routes: Routes = [
  { path: '', component: LandingComponent },
  { path: 'login', component: LoginComponent },
  { path: ':id', component: HomeComponent }
];

home.component.ts:

ngOnInit() {
   this.route.paramMap.subscribe(param => {
     let routeParam = param.get("id").toLowerCase()
     this.firebaseServcie.queryProfileByUniqueName(routeParam).subscribe(res => {
       if (res.length > 0) {
         //profile found ... some further actions
       }
       else {
         //profile not found ... usually show 404 message
       }
     });
   }
}

firebase.service.ts:

queryProfileByUniqueName(uniqueName: string): Observable<Profile[]> {
return this.firestore.collection<Profile>("profiles", ref => ref.where('uniqueName', '==', uniqueName))
  .valueChanges();
 }

Я сделал обходной путь путем итерации с ngFor над массивом Obervable с использованием канала async. Этот тип решает мою проблему, но ошибка все равно возникает, как я описал выше. Я бы очень хотел узнать, если это проблема с моей стороны или из Firebase.

1 Ответ

0 голосов
/ 08 мая 2020

открытие профиля в новой вкладке и переключение на него, пока он все еще загружается, приводит к следующей ошибке: Не удалось связаться с бэкэндом Firestore. Сервер не ответил в течение 10 секунд ...

Причина этого в том, что вы включили постоянство. Отключите постоянство, и ваша ошибка будет устранена.

Если открыто несколько вкладок, постоянство можно включить только на одной вкладке за раз. Кэш Cloud Firestore не очищается автоматически между сессиями.

Это описано в документации Firebase

https://firebase.google.com/docs/firestore/manage-data/enable-offline#configure_offline_persistence

...