Firebase authState наблюдаемые триггеры перед записью данных в базу данных - PullRequest
0 голосов
/ 27 февраля 2019

Я использую аутентификацию 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, где вы по существу имеете открытую связь для изменений один раз.

Спасибо !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...