Избегайте ошибки разрешения Firestore без использования первого оператора - PullRequest
0 голосов
/ 14 января 2020

У меня есть такой метод подписки, и он работает нормально.

 setOnboardingUser(uid: string): void {
    this.currentUserUid = uid;

    combineLatest([this.getProfile(uid), this.getUserFirstName(uid), this.getUserLastName(uid)]))
      .subscribe(([res1, res2, res3]) => {
        this.OnboardingUser = res1;
        this.userFirstName = res2.firstName;
        this.userLastName = res3.lastName;
      }, err => { console.log(err); }); // it throws error here when signout
  }

Но когда пользователь вышел из системы, он показывает ошибки разрешения Firestore. то есть у меня есть правила на Firestore

Я могу избежать этого, если я использую оператор first(), как это. Но так как мне нужно постоянное обновление пользовательского интерфейса, я не могу использовать first(). Можете ли вы сказать мне, как это сделать? т.е. избежать ошибок разрешений правил при выходе?

 setOnboardingUser(uid: string): void {
    this.currentUserUid = uid;

    combineLatest([this.getProfile(uid), this.getUserFirstName(uid), this.getUserLastName(uid)]).pipe(first())
      .subscribe(([res1, res2, res3]) => {
        this.OnboardingUser = res1;
        this.userFirstName = res2.firstName;
        this.userLastName = res3.lastName;
      }, err => { console.log(err); });
  }

Ошибка разрешения:

FirebaseError: Missing or insufficient permissions.
    at new FirestoreError (http://localhost:8100/vendor.js:101053:28)
    at JsonProtoSerializer.push../node_modules/@firebase/firestore/dist/index.cjs.js.JsonProtoSerializer.fromRpcStatus (http://localhost:8100/vendor.js:116278:16)
    at JsonProtoSerializer.push../node_modules/@firebase/firestore/dist/index.cjs.js.JsonProtoSerializer.fromWatchChange (http://localhost:8100/vendor.js:116791:44)
    at PersistentListenStream.push../node_modules/@firebase/firestore/dist/index.cjs.js.PersistentListenStream.onMessage (http://localhost:8100/vendor.js:112588:43)
    at http://localhost:8100/vendor.js:112517:30
    at http://localhost:8100/vendor.js:112557:28
    at http://localhost:8100/vendor.js:102396:20
    at ZoneDelegate.invoke (http://localhost:8100/polyfills.js:3594:26)
    at Object.onInvoke (http://localhost:8100/vendor.js:71855:33)
    at ZoneDelegate.invoke (http://localhost:8100/polyfills.js:3593:52)

signOut

 async signOut(): Promise<void> {
     return await this.afAuth.auth.signOut();
  }

1 Ответ

1 голос
/ 17 января 2020

Мне удалось решить эту проблему с помощью unsubscribe().

 private onboardingUserSubscription: Subscription;


setOnboardingUser(uid: string): void {
    this.currentUserUid = uid;

    this.onboardingUserSubscription = combineLatest([this.getProfile(uid), this.getUserFirstName(uid), this.getUserLastName(uid)]).pipe(first())
      .subscribe(([res1, res2, res3]) => {
        this.OnboardingUser = res1;
        this.userFirstName = res2.firstName;
        this.userLastName = res3.lastName;
      }, err => { console.log(err); });
  }

 ngOnDestroy(): void {
    this.onboardingUserSubscription.unsubscribe();
  }
...