Firebase rtdb 无法在构造函数中绑定值

Firebase rtdb cannot bind value in constructor

在我的服务构造函数中,我希望根据用户 ID(uid) 设置数据库的动态路径

 private dbPath = '/pages';
 private uid = '';
constructor(private db: AngularFireDatabase, private as: AuthService) {
   as.afAuth.user.subscribe(user => {
     this.uid = user.uid; 
     console.log(this.uid); //result: '12312313'(id of user)
   });
   this.userFormsRef = db.list(this.uid + '/' + this.dbPath);
   console.log(this.uid);  // result: '' (nothing)
 }

例如'uid'为空,我的进一步代码不能正常工作。似乎 angular 并没有真正将用户的 id 分配给 this.uid。那我该怎么做才能正确呢?

问题不在于您的 this.uid 是否设置,而是何时设置。您可以通过添加一些日志记录最轻松地看到这一点:

 private dbPath = '/pages';
 private uid = '';
 constructor(private db: AngularFireDatabase, private as: AuthService) {
   console.log('before subscribing');
   as.afAuth.user.subscribe(user => {
     console.log('got uid');
     this.uid = user.uid; 
     console.log(this.uid); //result: '12312313'(id of user)
   });
   console.log('after subscribing');
   this.userFormsRef = db.list(this.uid + '/' + this.dbPath);
 }

当您 运行 此代码打印时:

before subscribing

after subscribing

got uid

这可能不是您预期的顺序,但它正在按设计工作。由于用户数据是从 Firebase 异步加载的,因此您的主要代码继续 运行。然后当用户数据可用时,您的回调将被执行。

因此,到您的 db.list(this.uid + '/' + this.dbPath) 运行 时,this.uid = user.uid 还没有 运行。出于这个原因,任何需要用户数据的代码都需要在回调中,或者从那里调用。

像这样:

 private dbPath = '/pages';
 private uid = '';
 constructor(private db: AngularFireDatabase, private as: AuthService) {
   as.afAuth.user.subscribe(user => {
     this.uid = user.uid; 
     this.userFormsRef = db.list(this.uid + '/' + this.dbPath);
   });
 }

另见:

  • Using Firebase, firebase.auth().currentUser is a null value even though it is being logged