0
votes

Comment obtenir les utilisateurs actuels "UID" dans le composant | Angulaire 7

Essayer de faire en sorte que chaque utilisateur puisse créer et lire ses propres données. Je travaille tout de la même manière que dans ce tutoriel mais cela ne fonctionne pas comme là: https://angularfirebase.com/lessons/managing-firebase -user-relations-to-database-records /

Ma base de données est structurée comme ceci:

login() {
  this.afAuth.auth.signInWithPopup(new auth.GoogleAuthProvider());
}

logout() {
  this.afAuth.auth.signOut();
}

Ceci est mon service:

XXX

Et exemple de fonction dans le service qui récupère les éléments de la base de données:

getRelays(): Observable<any[]> {
    if(!this.userId) return;
    this.relaysRef = this.db.list('relays/' + this.userId)
    return this.relaysRef.snapshotChanges().pipe(
      map(changes => 
        changes.map(c => ({ $key: c.payload.key, ...c.payload.val() }))
      )
    );
  }

Je veux accéder à cet identifiant d'utilisateur actuel dans le composant afin que je puisse obtenir les éléments basés sur l'utilisateur actuel mais la variable userId ne fonctionne qu'à l'intérieur de l'abonnement et retourne indéfini en dehors de celui-ci.

Voici comment je me connecte et me déconnecte (dans un autre composant):

XXX

Merci pour votre aide!


0 commentaires

3 Réponses :


1
votes

le problème que vous avez rencontré parce que vous vous abonnez à un observable et chaque fois qu'il remarque des changements, il obtient des données avec un identifiant et change la valeur de "uid". la meilleure approche pour gérer cela est de stocker "responce.uid" dans votre stockage local et d'obtenir cet identifiant chaque fois que vous en avez besoin à partir du stockage local. comme ceci

 this.api.getUser(res.user.uid).subscribe(resp => {
    if (resp) {
      localStorage.setItem('uid', res.user.uid);
      localStorage.setItem('email', this.user.email); })


0 commentaires

2
votes

C'est parce que les observables sont asynchrones. Puisque les détails de l'utilisateur sont amenés de manière asynchrone. Le userId ne sera pas disponible en dehors de la méthode d'abonnement. Vous devez donc écrire la logique à l'intérieur du bloc d'abonnement afin d'obtenir le résultat souhaité.

this.afAuth.authState.subscribe(user => {
      if(user) this.userId = user.uid
      //you have to write the logic here.

    }) 


0 commentaires

1
votes

vous pouvez créer un service qui stockera les données utilisateur actuelles.

{{ currentUserService.user.id }}

quelque part dans votre code d'authentification Firebase:

constructor(public currentUserService: CurrentUserService) {}

Composant

whenLoggedIn(user: IUser) {
  this.currentUserService.user = user;
}

Modèle

interface IUser {
  id: number;
  name: string;
}

@Injectable()
export class CurrentUserService {
  user: IUser;
}


0 commentaires