【问题标题】:Create user in Firebase and save its data in Firestore at the same time in Angular在 Firebase 中创建用户并在 Angular 中同时将其数据保存在 Firestore 中
【发布时间】:2019-01-28 04:35:48
【问题描述】:

我正在使用 Angular 6 做一个 Web 应用程序,用户可以在其中创建一个帐户。在一个表单中,他们提供了他们的姓名、性别、出生等……我想在创建新帐户时将此数据保存到 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。

【问题讨论】:

  • 你能提供你尝试使用async/await的版本吗?
  • 嗨@Buczkowski,我已根据您的要求编辑了我的问题。

标签: javascript angular firebase google-cloud-firestore


【解决方案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 更多说明 - 如果您有一些 Promise 并希望在解决后等待价值,您可以使用 await 关键字,但要使用它,您必须添加 async 修饰符到方法/函数以及任何你将使用的地方,你应该在方法/函数执行之前添加 await。这个 await 可以跳过,IDE 可能会警告您,但要确保它会等待执行该特定操作,您应该添加 await。

【讨论】:

  • 非常感谢我的朋友。我不知道我也需要将async 和await 添加到另一种方法中。因此,为了澄清起见,如果我在一个服务中有一个 async/await 函数在另一个服务中使用另一个函数,那么它们总是需要在两者中都是 async/await 吗?我认为将async/await 添加到第一个方法将执行所有必要的调用,直到原始函数结束。你能解释一下背后的原因吗?
  • @RRGT19 刚刚添加,我希望它能告诉你更多信息,如果不是那么抱歉,我解释得不好:)
猜你喜欢
  • 2016-06-19
  • 2020-10-10
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
相关资源
最近更新 更多