2017-10-10 7 views
2

Est-il possible de se désinscrire d'un valueChanges()? Quand mes utilisateurs se connectent, je récupérer leurs données utilisateur comme celui-ciFirestore: Se désinscrire de valueChanges (l'utilisateur obtient "Missing permissions" lors de la déconnexion)

this.user$ = this.afAuth.authState.flatMap(authUser => { 
    if (!authUser) { 
    this.user = null; 
    return Observable.of(this.user); 
    } 

    return this.db.doc<UserServerData>(`users/${authUser.uid}`) 
    .valueChanges() 
    .map(user => new User(authUser.uid, user)); 
}); 

Bien sûr, j'ai une règle sur Firestore disant que seul l'utilisateur avec un identifiant spécifique peut lire ces données de l'utilisateur ... Ainsi, lorsqu'un l'utilisateur se déconnecte, toutes les requêtes avec une règle sur l'identifiant utilisateur échouent et j'obtiens une erreur "Missing permissions".

Alors, voici ma question, comment dois-je faire cela? Existe-t-il un moyen de se désabonner d'une requête?

Merci beaucoup

Répondre

1

Auteur AngularFire ici.

Vous avez deux options. Renvoyez un ensemble vide pour les utilisateurs déconnectés ou utilisez un garde d'itinéraire.

Le retour d'un ensemble vide est facile. Remplacez .of(null) par un tableau vide.

this.user$ = this.afAuth.authState.switchMap(authUser => { 
    if (!authUser) { 
    this.user = null; 
    return Observable.of(null); 
    } 
    return this.db.doc<UserServerData | null>(`users/${authUser.uid}`) 
    .valueChanges() 
    .map(user => new User(authUser.uid, user)); 
}); 

Using a route guard is a bit more complicated et nécessite une dépendance à l'@angular/router. Cependant, il s'assurera que l'utilisateur existe avant le chargement de l'itinéraire.

+0

Salut David. Merci. Pourquoi devrais-je retourner un tableau depuis que j'interroge un document, pas une collection? Quoi qu'il en soit, je l'ai essayé et Typescript échoue à la compilation car mon Observable attend un type de données "Utilisateur" ('user $: Observable ') et j'essaye de lui donner un tableau vide. Aussi j'utilise Ionic, donc pas de routeur angulaire pour moi. Puisque je suis dans un switchMap, sommes-nous sûrs que la requête Firestore n'est pas déclenchée par le changement d'authState? Merci encore (Love the Firecasts) – Maslow

+0

Bon point! Je l'ai mis à jour pour permettre une valeur nulle OU un utilisateur. Cela dépend cependant de votre modèle. Je recommande d'utiliser l'opérateur de suppression de null (?) Pour contourner ce problème. –

+0

Désolé David. Malheureusement, cela ne règle pas le problème. Nous disons à la requête qu'elle peut maintenant retourner une valeur nulle, mais elle essaiera quand même d'aller chercher l'utilisateur à 'users/UID' pour que nous obtenions toujours une erreur" Missing ou insuffisances d'autorisations ". Je pensais que la vérification de 'authUser' serait suffisante, mais il semble que la connexion avec Firestore soit faite dans le switchMap. Peut-être que c'est le problème? Dois-je attraper l'erreur quelque part pour éviter l'erreur d'exécution? – Maslow