将数据写入数据库之前,Firebase authState可观察触发器

时间:2019-02-27 04:49:56

标签: angular firebase angularfire2

我正在使用Firebase身份验证进行用户注册和登录。为了听取身份验证状态更改,我在AuthService构造函数中使用以下代码。我的应用中的其他页面可以订阅user$并返回有关用户的数据:

//auth.service.ts constructor
this.user$ = this.afAuth.authState.pipe(
  switchMap(
    (user) => {
      return user ? db.query$(`user/find?userUID=${user.uid}`) : of(null)
    } 
  )
);

当用户登录时,它可以完美地工作,但是,当用户注册时,它不起作用。这是我的理论。...

我正在使用自己的SQL数据库,当用户注册时,我使用Firebase提供的uid并将其存储在数据库中,如下所示:

//signup.page.ts
async onSignUp() {
    await this.auth.userSignUp(this.signUpForm).then((token) => {
      this.db.query$('auth/register', {
        userUID: token
      }).subscribe((user: any) => {
          //i can access my user object that is returned from api call here
    })
  }

我上面使用的AuthService注册方法如下:

  //auth.service.ts method
  async userSignUp(signUpForm: FormGroup): Promise<string> {
    await this.afAuth.auth.createUserWithEmailAndPassword(email, password);
    this.token = this.afAuth.auth.currentUser.uid;
    return this.token;
  }

createUserWithEmailAndPassword()完成后,将触发authState更改,并尝试对该用户运行数据库查询(请参阅第一种方法),但尚未创建(我的理论),因此它返回null。刷新页面后,它可以正常运行。所以我的问题是,在行已写入数据库之前,我该如何推迟运行db查询? socket.io可以解决这个问题吗?

其他信息

在切换到自己的SQL数据库之前,我在Firestore中使用了此精确过程,因此效果很好。我认为我的问题之一是auth.service.ts构造函数中的查询最终是一个http GET请求,即使我可以订阅它,它也只会返回一个响应,这与Firestore不同,在Firestore中,您实际上是为更改一旦订阅。

谢谢!

0 个答案:

没有答案