使用Firebase,firebase.auth()。currentUser即使正在记录也是空值

时间:2017-09-25 00:07:37

标签: javascript angular typescript firebase-realtime-database firebase-authentication

我创建了一个Service.TS文件中的查询,该文件显示了一个项目" state"这是基于登录用户的UID:

getLists(): FirebaseListObservable<any> {

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {console.log("blah", firebase.auth().currentUser.uid)
    // User is signed in.
  }
});
  return this.db.list('/foods', {
    query: {
      orderByChild: 'state/'+firebase.auth().currentUser.uid+'/state',
      equalTo: 'listed'
    }
  });
}

使用此查询,我收到的错误显示为:

未捕获(承诺):TypeError:null不是对象(评估&#39; WEBPACK_IMPORTED_MODULE_2_firebase_app &#34; auth&#34; .curren tUser.uid&#39;)。< / p>

使用上面显示的{console.log("blah", firebase.auth().currentUser.uid),可以在日志中正确显示UID,确认用户已登录。

我不确定它是否相关,但此查询是由网页的主要TS文件调用的:

    ngOnInit() {

    this.moviesSvc.getLists()
                  .subscribe(lists => {console.log(lists); console.log("UID", firebase.auth().currentUser.uid); this.lists = lists})
  }

我需要做什么才能正确地将UID传递给查询?

1 个答案:

答案 0 :(得分:3)

onAuthStateChanged()是异步的,所以当你的回调中有用户uid时,只执行你的操作,如下所示:

getLists(): FirebaseListObservable<any> {

    var self = this;

    firebase.auth().onAuthStateChanged(function(user) {
        if (user) {
            // User is signed in.
            var userID = user.uid;

            return self.db.list('/foods', {
                query: {
                    orderByChild: 'state/' + userID + '/state',
                    equalTo: 'listed'
                }
            });
        }
    });

}