Создайте пользователя в Firebase и одновременно сохраните его данные в Firestore в Angular.

Я делаю веб-приложение в 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
2 239
1

Ответ:

Решено

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

  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 Еще немного пояснений. Если у вас есть Обещать и вы хотите дождаться значения после разрешения, вы можете использовать ключевое слово Ждите, но для его использования вам нужно добавить модификатор асинхронный к методу/функции, и везде, где вы будете использовать, вы должны добавить Ждите перед выполнение метода/функции. Этот Ждите можно пропустить, и IDE, вероятно, предупредит вас, но чтобы быть уверенным, что он будет ждать выполнения этого конкретного действия, вы должны добавить Ждите.