我的应用程序使用Flutter和Firebase,下面是注册函数的代码:
Future registerWithEmailAndPassword(String email, String name, String password) async {
try{
// Creates user account with Firebase Auth:
UserCredential result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
User user = result.user!;
// Creates a new document in Firestore with the uid:
await DatabaseService(uid: user.uid).createUserData(
name: name,
email: email,
);
return _userObjectFromUser(user);
} on FirebaseAuthException catch(e) {
return e;
}
}
它运行得很好。但是,我一直在想这是否是最好的方法......如果在Firestore中创建帐户之后但在创建文档之前连接中断了呢?如果由于某种原因文档创建失败了呢?那么用户将处于一种奇怪的情况,他们有一个帐户,但没有数据保存在数据库中,这意味着应用程序可能会永远加载。
所以,我想知道:是否有一种方法可以创建类似于批处理写入的东西,以便在创建文档的同时创建帐户?
2条答案
按热度按时间c86crjj01#
我想您不应该担心这个问题,因为这两个方法将在对方上运行,它们发生这种情况的可能性非常小,要么都成功,要么都失败,但是,我可以建议在这些情况下侦听
authStateChanges()
流,并根据它采取行动,同时使用isNew
,如下所示:实际上,如果你愿意实现这段代码或类似的东西,你可能想知道,通过这段代码,你可以确保100%的用户在数据库中有一个文档,但它会花费你一个额外的阅读检查该文档的存在。
bkhjykvo2#
因为您使用
google-cloud-functions
进行标记,所以执行create-user-and-write-profile-document将减少您所谈论的中断类型的机会。但我的方法通常是,在每次
onAuthState
更改的侦听器为用户获取一个值时编写概要文件文档,或者在此时检查文档是否存在,并在需要时创建它。