一旦 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 代码中实现这种原子性。
谢谢
一旦 Firebase createUserWithEmailAndPassword 成功,我将尝试在 Firestore 上的“用户”集合中创建一个用户。我想让这个原子像删除创建的用户一样。
Firebase 不支持跨产品事务操作。因此,您无法一步执行两个原子操作,例如在 Firebase 身份验证中使用电子邮件和密码创建用户并在 Firestore 中添加用户,这意味着两个操作要么都成功,要么都失败并出现错误。
因此,最好的选择是嵌套这两个调用并始终处理错误。如果第一个操作失败,则停止,不执行第二个操作,或者如果第二个操作失败,则回滚第一个操作。
处理这种情况的更方便的方法是触发 Cloud Function 以响应 Firebase 用户帐户的创建。我发现您不想使用云函数,但在我看来,在这种情况下这是最方便的方法,您只需要在客户端处理单个操作。