Nach dem Anmelden habe ich einige Firebase-Referenzen abonniert und logge mich anschließend ab (FirebaseAuth.logout). Sobald ich mich abmelde, erhalte ich eine Firebase-Warnung in der Konsole: "Ausnahme wurde durch Benutzerrückruf ausgelöst. Fehler: permission_denied at ...." und dies wird eine tatsächliche Ausnahme. Während ich dieses Verhalten erwarte, was sind die besten Vorgehensweisen zum Protokollieren eines Benutzers, sodass ich diese Warnung/Ausnahme nicht sehe?Angularfire2: Abmeldeausnahme und bewährte Methoden
Antwort
Ich hatte das gleiche Problem. Durch die folgende Quelle habe ich bisher eine Lösung gefunden, mit der ich noch nicht zufrieden bin. Source 1
Das Problem liegt in der Tatsache, dass es noch eine offene, nicht abgemeldete Subskription (Verbindung zu Firebase) irgendwo in Ihrem Code gibt.
Zum Beispiel habe ich
this.name_sub = this.af.database.object("https://stackoverflow.com/users/" + user.uid + "/name")
.subscribe(data => {
this.globals.user.name = data.$value;
}
);
, die völlig in Ordnung ist, bis zu dem Punkt Sie this.af.auth.logout();
sind aufgerufen wird. Wenn Sie Ihre Firebase-Sicherheitseinstellungen richtig eingerichtet haben, gibt Firebase einen Fehler aus, weil Sie nicht mehr mit dem Benutzer angemeldet sind - Sie sind jetzt anonym, und Sie sollten in einem Benutzerbereich gesperrt werden. Und da das oben genannte Abonnement noch aktiv ist, teilt Firebase Ihnen mit, dass Sie keinen Zugriff auf den Zielbenutzerbereich mit anonym haben.
Daher müssen Abonnements geschlossen werden. Eine Möglichkeit, dies zu tun, ist, fügt
irgendwo in Ihrer Komponente. Dies würde Ihr Abonnement schließen, wenn Sie Ihre . Leider ist das für mich nicht möglich, da ich mich in einer anderen Komponente abmelde. Die Art, wie ich es jetzt mache, ist das Schließen des Abonnements, gleich nachdem ein Wert erhalten wurde.
this.name_sub = this.af.database.object("https://stackoverflow.com/users/" + user.uid + "/name")
.subscribe(data => {
this.globals.user.name = data.$value;
this.name_sub.unsubscribe(); // <-- important part
}
);
Für mich ist das super kontraintuitiv. Ich denke, wir brauchen einen Weg, um Werte zu erhalten, ohne permanent den Datenkanal zu abonnieren und ohne zusätzliche Module zu importieren.
Dies ist die richtige Antwort; Alle Abonnements müssen abgemeldet werden, bevor Sie sich abmelden. Im Allgemeinen wird dies in ngOnDestroy gemacht, wie von Niklas aufgezeigt, und ist trotzdem die beste Vorgehensweise, um Speicherlecks zu vermeiden. –
Gibt es eine Möglichkeit, alles abzubestellen, bevor Sie sich abmelden? Ich finde es nur sehr mühsam, alle Abonnements zu finden und es ist auch sehr leicht in der Zukunft zu vergessen. – alltej
Es ist hässlich, aber funktioniert:
signOut(): void {
this.router.navigate(['/app').then(() => {
firebase.database().goOffline() // <=== this eliminates error!
this.afAuth.auth.signOut()
})
}
Bitte erläutern Sie, warum der Code funktioniert. –
- 1. Dependency Injection Bewährte Methoden
- 2. Bewährte Methoden bei den Konfigurationseinstellungen
- 3. Bewährte Methoden: Identitätspool für Anwendungspools
- 4. Bewährte Methoden in Visual Studio C++
- 5. Bildgröße Bewährte Methoden für die mobile Anwendung
- 6. Aktualisieren einer Webanwendung in IIS - bewährte Methoden
- 7. Bewährte Methoden: fail() vs. assertTrue (false)
- 8. Bewährte Methoden: Ausnahmen von den Eigenschaften werfen
- 9. Bewährte Methoden: C# Namespace für Erweiterungsmethoden und Erweiterungsmethoden promoten
- 10. NSError-Domänen/benutzerdefinierte Domänen - Konventionen und bewährte Methoden
- 11. Abfrage beobachtbar und angularfire2
- 12. Angular2 und Firebase (AngularFire2)
- 13. Firebase-Speicher und angularfire2
- 14. Was sind in Subversion bewährte Methoden zum Ändern historischer Dateien?
- 15. Bewährte Methoden zum Erstellen von benutzerdefinierten Steuerelementen für Composite WPF
- 16. Bewährte Methoden zum Erstellen eines Log-Writers für Fehler
- 17. Bereitstellen von ASP.NET MVC unter Linux: Bewährte Methoden, Tools und Überraschungen
- 18. Firebase angularfire2 Objekt aus Datenbank
- 19. Bewährte Java-Architektur für Unternehmensanwendungen
- 20. Drei-Wege-Bindung in Angular 2 und Angularfire2
- 21. Authentifizierung Email/Passwort mit Firebase sdk3 und Angularfire2
- 22. Bewährte Methoden, um ein Cairngorm Flex Project zu behalten DRY (wiederhole dich nicht)
- 23. Benutzerzugriffsrechte oder Berechtigungen für Funktionen einer Webanwendung Muster oder bewährte Methoden
- 24. , wie man Feuerbasis Login Veranstaltungen mit angularfire2
- 25. Ungültiger Berechtigungsnachweisfehler in Angularfire2 oauth login
- 26. Unterstützt AngularFire2 die Aktualisierung von Benutzeranmeldeinformationen?
- 27. Wirklich bewährte Methode, IBOutlet-Ansichtselemente beizubehalten?
- 28. Erhalte Zeit in Firebase-Datenbank mit angularfire2
- 29. Persist angemeldet Benutzer mit angularfire2 mit Cookies
- 30. npm angularfire2 installieren wird mit Fehler ELIFECYCLE
Dies ist eine gute Frage, und es ist bedauerlich, dass niemand Einsicht zur Verfügung gestellt hat. –