我正在使用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中,您实际上是为更改一旦订阅。
谢谢!