我们如何确保“在 createUserWithEmailAndPassword 上成功将用户详细信息添加到‘用户’集合中”在 Firebase (Flutter) 中是原子的

问题描述 投票:0回答:1

一旦 Firebase createUserWithEmailAndPassword 成功,我将尝试在 Firestore 上创建一个正在使用的用户集合。我想让这个原子像删除创建的用户一样(如何)。有像 cloud_functions 这样的替代方案,但我想在没有这些的情况下完成它。

这是我的代码

    try {
      UserCredential userCredential = await Auth()
          .createUserWithEmailAndPassword(email: email, password: password);
      await FirebaseFirestore.instance
          .collection("users")
          .doc(userCredential.user!.uid)
          .set({"name": name, "email": email, "password": password});
      _isRegistrationSuccess = true;
      onRegister?.call();
    } catch (e) {
      _isRegistrationSuccess = false;
    }

我们如何确保 try 块中的代码是原子的,即如果后续步骤失败(全部或无),则 createUserWithEmailAndPassword 会回滚。如果 firebase 没有提供开箱即用的功能,请告诉我们如何在 dart 代码中实现这种原子性。

谢谢

flutter firebase dart google-cloud-firestore atomic
1个回答
0
投票

一旦 Firebase createUserWithEmailAndPassword 成功,我将尝试在 Firestore 上的“用户”集合中创建一个用户。我想让这个原子像删除创建的用户一样。

Firebase 不支持跨产品事务操作。因此,您无法一步执行两个原子操作,例如在 Firebase 身份验证中使用电子邮件和密码创建用户并在 Firestore 中添加用户,这意味着两个操作要么都成功,要么都失败并出现错误。

因此,最好的选择是嵌套这两个调用并始终处理错误。如果第一个操作失败,则停止,不执行第二个操作,或者如果第二个操作失败,则回滚第一个操作。

处理这种情况的更方便的方法是触发 Cloud Function 以响应 Firebase 用户帐户的创建。我发现您不想使用云函数,但在我看来,在这种情况下这是最方便的方法,您只需要在客户端处理单个操作。

© www.soinside.com 2019 - 2024. All rights reserved.