How to get current users “uid” in component | Angular 7












0















Trying to make that each user can create and read his own data.
I am working everything same as in this tutorial but its not working as there:
https://angularfirebase.com/lessons/managing-firebase-user-relationships-to-database-records/



My database is structured like this:



 -|items
-|userId
-|itemId


This is my service:



  userId: string;

constructor(private db: AngularFireDatabase, private afAuth: AngularFireAuth) {
this.afAuth.authState.subscribe(user => {
if(user) this.userId = user.uid
})
}


And example function in service that gets items from database:



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() }))
)
);
}


I want to access that current users id in component so I can get items based on current user but variable userId only works inside subscription and returns undefined outside it.



This is how i login and logout (in another component):



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

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


Thanks for help!










share|improve this question





























    0















    Trying to make that each user can create and read his own data.
    I am working everything same as in this tutorial but its not working as there:
    https://angularfirebase.com/lessons/managing-firebase-user-relationships-to-database-records/



    My database is structured like this:



     -|items
    -|userId
    -|itemId


    This is my service:



      userId: string;

    constructor(private db: AngularFireDatabase, private afAuth: AngularFireAuth) {
    this.afAuth.authState.subscribe(user => {
    if(user) this.userId = user.uid
    })
    }


    And example function in service that gets items from database:



    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() }))
    )
    );
    }


    I want to access that current users id in component so I can get items based on current user but variable userId only works inside subscription and returns undefined outside it.



    This is how i login and logout (in another component):



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

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


    Thanks for help!










    share|improve this question



























      0












      0








      0








      Trying to make that each user can create and read his own data.
      I am working everything same as in this tutorial but its not working as there:
      https://angularfirebase.com/lessons/managing-firebase-user-relationships-to-database-records/



      My database is structured like this:



       -|items
      -|userId
      -|itemId


      This is my service:



        userId: string;

      constructor(private db: AngularFireDatabase, private afAuth: AngularFireAuth) {
      this.afAuth.authState.subscribe(user => {
      if(user) this.userId = user.uid
      })
      }


      And example function in service that gets items from database:



      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() }))
      )
      );
      }


      I want to access that current users id in component so I can get items based on current user but variable userId only works inside subscription and returns undefined outside it.



      This is how i login and logout (in another component):



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

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


      Thanks for help!










      share|improve this question
















      Trying to make that each user can create and read his own data.
      I am working everything same as in this tutorial but its not working as there:
      https://angularfirebase.com/lessons/managing-firebase-user-relationships-to-database-records/



      My database is structured like this:



       -|items
      -|userId
      -|itemId


      This is my service:



        userId: string;

      constructor(private db: AngularFireDatabase, private afAuth: AngularFireAuth) {
      this.afAuth.authState.subscribe(user => {
      if(user) this.userId = user.uid
      })
      }


      And example function in service that gets items from database:



      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() }))
      )
      );
      }


      I want to access that current users id in component so I can get items based on current user but variable userId only works inside subscription and returns undefined outside it.



      This is how i login and logout (in another component):



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

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


      Thanks for help!







      angular typescript firebase firebase-authentication angularfire2






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Jan 3 at 20:42









      Frank van Puffelen

      244k29389416




      244k29389416










      asked Jan 3 at 19:30









      Timotej SofijanovićTimotej Sofijanović

      104




      104
























          3 Answers
          3






          active

          oldest

          votes


















          2














          It's because observables are asynchronus. Since the details of the user are brought in an asynchronous manner. The userId will not be available outside the subscribe method. So you need to write the logic inside the subscribe block inorder to achieve the desired result.



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

          })





          share|improve this answer































            1














            the problem you faced because you are subscribing to an observable and whenever it notice any changes it get some data with id and changes the value of "uid".
            the best approach to handle this is to store "responce.uid" to your local storage and get that id whenever you need from local storage.
            like this



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





            share|improve this answer































              0














              you can create a service which will store current user data.



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

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


              somewhere in your firebase auth code:



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


              Component



              constructor(public currentUserService: CurrentUserService) {}


              Template



              {{ currentUserService.user.id }}





              share|improve this answer
























                Your Answer






                StackExchange.ifUsing("editor", function () {
                StackExchange.using("externalEditor", function () {
                StackExchange.using("snippets", function () {
                StackExchange.snippets.init();
                });
                });
                }, "code-snippets");

                StackExchange.ready(function() {
                var channelOptions = {
                tags: "".split(" "),
                id: "1"
                };
                initTagRenderer("".split(" "), "".split(" "), channelOptions);

                StackExchange.using("externalEditor", function() {
                // Have to fire editor after snippets, if snippets enabled
                if (StackExchange.settings.snippets.snippetsEnabled) {
                StackExchange.using("snippets", function() {
                createEditor();
                });
                }
                else {
                createEditor();
                }
                });

                function createEditor() {
                StackExchange.prepareEditor({
                heartbeatType: 'answer',
                autoActivateHeartbeat: false,
                convertImagesToLinks: true,
                noModals: true,
                showLowRepImageUploadWarning: true,
                reputationToPostImages: 10,
                bindNavPrevention: true,
                postfix: "",
                imageUploader: {
                brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                allowUrls: true
                },
                onDemand: true,
                discardSelector: ".discard-answer"
                ,immediatelyShowMarkdownHelp:true
                });


                }
                });














                draft saved

                draft discarded


















                StackExchange.ready(
                function () {
                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54028662%2fhow-to-get-current-users-uid-in-component-angular-7%23new-answer', 'question_page');
                }
                );

                Post as a guest















                Required, but never shown

























                3 Answers
                3






                active

                oldest

                votes








                3 Answers
                3






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                2














                It's because observables are asynchronus. Since the details of the user are brought in an asynchronous manner. The userId will not be available outside the subscribe method. So you need to write the logic inside the subscribe block inorder to achieve the desired result.



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

                })





                share|improve this answer




























                  2














                  It's because observables are asynchronus. Since the details of the user are brought in an asynchronous manner. The userId will not be available outside the subscribe method. So you need to write the logic inside the subscribe block inorder to achieve the desired result.



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

                  })





                  share|improve this answer


























                    2












                    2








                    2







                    It's because observables are asynchronus. Since the details of the user are brought in an asynchronous manner. The userId will not be available outside the subscribe method. So you need to write the logic inside the subscribe block inorder to achieve the desired result.



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

                    })





                    share|improve this answer













                    It's because observables are asynchronus. Since the details of the user are brought in an asynchronous manner. The userId will not be available outside the subscribe method. So you need to write the logic inside the subscribe block inorder to achieve the desired result.



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

                    })






                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Jan 3 at 21:02









                    arkark

                    5951619




                    5951619

























                        1














                        the problem you faced because you are subscribing to an observable and whenever it notice any changes it get some data with id and changes the value of "uid".
                        the best approach to handle this is to store "responce.uid" to your local storage and get that id whenever you need from local storage.
                        like this



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





                        share|improve this answer




























                          1














                          the problem you faced because you are subscribing to an observable and whenever it notice any changes it get some data with id and changes the value of "uid".
                          the best approach to handle this is to store "responce.uid" to your local storage and get that id whenever you need from local storage.
                          like this



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





                          share|improve this answer


























                            1












                            1








                            1







                            the problem you faced because you are subscribing to an observable and whenever it notice any changes it get some data with id and changes the value of "uid".
                            the best approach to handle this is to store "responce.uid" to your local storage and get that id whenever you need from local storage.
                            like this



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





                            share|improve this answer













                            the problem you faced because you are subscribing to an observable and whenever it notice any changes it get some data with id and changes the value of "uid".
                            the best approach to handle this is to store "responce.uid" to your local storage and get that id whenever you need from local storage.
                            like this



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






                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered Jan 3 at 20:27









                            Muhammad AbdullahMuhammad Abdullah

                            42416




                            42416























                                0














                                you can create a service which will store current user data.



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

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


                                somewhere in your firebase auth code:



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


                                Component



                                constructor(public currentUserService: CurrentUserService) {}


                                Template



                                {{ currentUserService.user.id }}





                                share|improve this answer




























                                  0














                                  you can create a service which will store current user data.



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

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


                                  somewhere in your firebase auth code:



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


                                  Component



                                  constructor(public currentUserService: CurrentUserService) {}


                                  Template



                                  {{ currentUserService.user.id }}





                                  share|improve this answer


























                                    0












                                    0








                                    0







                                    you can create a service which will store current user data.



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

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


                                    somewhere in your firebase auth code:



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


                                    Component



                                    constructor(public currentUserService: CurrentUserService) {}


                                    Template



                                    {{ currentUserService.user.id }}





                                    share|improve this answer













                                    you can create a service which will store current user data.



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

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


                                    somewhere in your firebase auth code:



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


                                    Component



                                    constructor(public currentUserService: CurrentUserService) {}


                                    Template



                                    {{ currentUserService.user.id }}






                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered Jan 3 at 22:18









                                    m.kochm.koch

                                    1042




                                    1042






























                                        draft saved

                                        draft discarded




















































                                        Thanks for contributing an answer to Stack Overflow!


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid



                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.


                                        To learn more, see our tips on writing great answers.




                                        draft saved


                                        draft discarded














                                        StackExchange.ready(
                                        function () {
                                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54028662%2fhow-to-get-current-users-uid-in-component-angular-7%23new-answer', 'question_page');
                                        }
                                        );

                                        Post as a guest















                                        Required, but never shown





















































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown

































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown







                                        Popular posts from this blog

                                        Mossoró

                                        Error while reading .h5 file using the rhdf5 package in R

                                        Pushsharp Apns notification error: 'InvalidToken'