Я использую аутентификацию 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, и когда пользователь регистрируется, я беру uid
, предоставленный Firebase, и сохраняю его в своей базе данных примерно так:
//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
и пытается выполнить запрос БД дляэтот пользователь (см. первый метод), но он еще не был создан ( моя теория ), поэтому он возвращает ноль.После того, как я обновляю страницу, она работает отлично.Итак, мой вопрос: как я могу задержать выполнение запроса db, пока строка не будет записана в моей базе данных?Будет ли socket.io решением этой проблемы?
Дополнительная информация
Я использовал этот точный процесс, используя Firestore, прежде чем переключиться на свою собственную базу данных SQL, и она отлично работала.Я думаю, что одна из моих проблем заключается в том, что запрос в конструкторе auth.service.ts
, в конечном счете, является запросом HTTP GET, и, хотя я могу подписаться на него, он вернет ТОЛЬКО один ответ, в отличие от Firestore, где вы по существу имеете открытую связь для изменений один раз.
Спасибо !!