Firestore交易-交易失败:TypeError:transaction.set(...)。则不是函数

时间:2019-03-20 15:17:05

标签: angular firebase google-cloud-firestore angularfire2

我已经写了一个事务,以在尝试创建用户之前检查该用户是否在Firestore中。

  setUserData(uid, email, displayName, photoURL, firstName, lastName, referralId) {
    const userRef = this.afs.firestore.collection('users').doc(`${uid}`);
    return this.afs.firestore.runTransaction(async (transaction: any) => {
      const doc = await transaction.get(userRef);
      let userData = {};
      if (!doc.exists) {
        userData = {
          uid: uid,
          email: email,
          displayName: displayName,
          photoURL: photoURL,
          emailVerified: true,
          firstName: firstName,
          lastName: lastName,
          referralId: referralId
        };
        transaction.set(userRef, { userData }, { merge: true }).then(() => {
          this.referralService.addUserToWaitlist(referralId);
        });
      }
    }).then(() => {
      if (!environment.production) {
        console.log(
          'Transaction successfully committed.'
        );
      }
    }).catch((error) => {
      if (!environment.production) {
        console.log('Transaction failed: ', error);
      }
    });
  }

但是,我不断收到以下错误消息:

Transaction failed:  TypeError: transaction.set(...).then is not a function

transaction是否不等于then

1 个答案:

答案 0 :(得分:1)

这不是在事务中编写文档的方式。由于一笔交易是一项全有或全无的操作,因此您不能等待set()完成才继续进行另一笔交易,因此它对返回承诺没有帮助。对于事务,您必须在功能结束之前set()保留所有文档,然后最后,事务将尝试全部写入它们。如果不能全部以原子方式编写,则您的事务功能将再次运行。

还要注意,transaction.set()的普通JavaScript API(非Angular)已声明返回相同的Transaction对象而不是promise。