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!
3 Réponses :
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); })
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. })
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; }