Хранение пользователя в базе данных в firestore - PullRequest
0 голосов
/ 10 ноября 2019

Я работаю с Firebase и у меня возникли некоторые проблемы. При создании нового пользователя я могу сохранить его в своей базе данных, но позже при доступе к другому компоненту происходит сбой.

//Register a new user in our system
  registerUserByEmail(email: string, pass: string) {
    return this.afAuth.auth
      .createUserWithEmailAndPassword(email, pass)
      .then(res => {
        this.email = res.user.email;
        let user = {
          email: this.email,
          goal: "",
          previousGoals: [],
          progress: {
            accomplishedToday: false,
            completedGoals: 0,
            daysInRow: 0,
            unlockedBadges: []
          }
        };
        // store in database
        new Promise<any>((resolve, reject) => {
          this.firestore
            .collection("users")
            .add(user)
            .then(
              res => {
                console.log(res.id);
                this.isAuthenticated = true;
                this.router.navigate(["/dashboard"]);
              },
              err => reject(err)
            );
        });
      });
  }

Я считаю, что этот фрагмент кода в основном регистрируется как пользовательотправить письмо и успешно сохранить его в моей базе данных (проверил его).

Тем не менее при рендеринге home.component или /dashboard

home.component

ngOnInit() {
    this.setAuthStatusListener();
    this.getUser();
  }

  getUser() {
    this.data.getUser().subscribe(user => {
      this.user = user.payload.data();
    });
  }

data.service

getUser() {
    return this.firestore
      .collection("users")
      .doc(this.currentUser.uid)
      .snapshotChanges();
  }

Я получаю следующую ошибку ОШИБКА

TypeError: Невозможно прочитать свойство 'uid'нуля

Сервис

1 Ответ

0 голосов
/ 10 ноября 2019

Похоже, что к тому времени, когда вы звоните getUser, пользователь еще не прошел аутентификацию.

Простое исправление, позволяющее избавиться от ошибки, состоит в проверке этого состояния в getUser вашего DataService. :

getUser() {
  if (this.currentUser) {
    return this.firestore
      .collection("users")
      .doc(this.currentUser.uid)
      .snapshotChanges();
  }
}

Однако, учитывая эту последовательность вызовов, я думаю, что может быть лучший способ справиться с вашим вариантом использования:

ngOnInit() {
  this.setAuthStatusListener();
  this.getUser();
}

Поскольку вы подключив прослушиватель состояния аутентификации , вы, вероятно, захотите начать просмотр данных пользователя в Firestore только после того, как пользователь действительно будет аутентифицирован.

Один из простых способов сделать это - вызвать ваш DataService getUser() метод изнутри слушателя состояния аутентификации, как только пользователь аутентифицирован. Как то так:

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    this.getUser(); // call the DataService's getUser method
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...