Создайте пользователя в Firebase и сохраните его данные в Firestore одновременно в Angular - PullRequest
0 голосов
/ 28 января 2019

Я делаю веб-приложение на Angular 6, где пользователи могут создавать учетные записи.Внутри формы они дают свои имена, пол, рождение и т. Д. Я хотел бы сохранить эти данные в Firestore при создании новой учетной записи.

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

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

Моя пользовательская модель:

export interface User {
  firstName: string;
  secondName: string;
  firstSurname: string;
  secondSurname: string;
  emailAddress: string;
}

Когда вы закончите форму и нажмете Отправить:

  onFormSubmit() {
    const password = this.personalInformation.get('password').value;

    const user: User = {
      firstName: this.personalInformation.get('firstName').value,
      secondName: this.personalInformation.get('secondName').value,
      firstSurname: this.personalInformation.get('firstSurname').value,
      secondSurname: this.personalInformation.get('secondSurname').value,
      emailAddress: this.personalInformation.get('emailAddress').value
    };

    this.authService.register(user, password)
      .then(res => {
      }, err => {
        console.log(err);
      });
  }

Метод создания пользователя и добавления данных в Firestore:

  register(user: User, password: string) {

    return new Promise<any>((resolve, reject) => {
      this.afAuth.auth.createUserWithEmailAndPassword(user.emailAddress, password)
        .then(res => {

          Object.assign(user, {
            'dateOfCreationAccount': new Date(res.user.metadata.creationTime),
            'lastSignInTime': new Date(res.user.metadata.lastSignInTime)
          });

          // Add user to firestore
          this.firestoreService.addUser(res.user.uid, user);

          // Send verification email
          this.sendVerificationEmail();

          // Logout user
          this.logout();

          resolve(res);

        }, err => reject(err));
    });
  }

Тот же метод с async / await:

  register(user: User, password: string) {

    return new Promise<any>((resolve, reject) => {
      this.afAuth.auth.createUserWithEmailAndPassword(user.emailAddress, password)
        .then(async res => {

          Object.assign(user, {
            'dateOfCreationAccount': new Date(res.user.metadata.creationTime),
            'lastSignInTime': new Date(res.user.metadata.lastSignInTime)
          });

          // Add user to firestore
          await this.firestoreService.addUser(res.user.uid, user);

          // Send verification email
          this.sendVerificationEmail();

          // Logout user
          this.logout();

          resolve(res);

        }, err => reject(err));
    });
  }

Метод добавления данныхв Firestore:

  addUser(uid: string, data: User) {
    this.usersCollection.doc(uid).set(data);
  }

Кажется, что строка this.firestoreService.addUser игнорируется.Идея состоит в том, чтобы сразу же сохранить данные пользователя в Firestore после создания его учетной записи.

1 Ответ

0 голосов
/ 28 января 2019

Попробуйте изменить это:

  addUser(uid: string, data: User) {
    this.usersCollection.doc(uid).set(data);
  }

на это:

  async addUser(uid: string, data: User) {
    await this.usersCollection.doc(uid).set(data);
  }

Редактировать 1 Еще немного уточнений - Если у вас есть Обещание и вы хотитедождитесь значения от этого после разрешения, вы можете использовать ключевое слово await , но чтобы использовать его, вы должны добавить модификатор async к методу / функции и везде, где вы будете использовать, вы должны добавить ждите перед выполнением метода / функции.Это await может быть пропущено, и IDE, вероятно, предупредит вас, но чтобы быть уверенным в том, что он будет ожидать выполнения этого конкретного действия, вы должны добавить await .

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