firebase 在Firestore中同时创建帐户和文档?

v09wglhw  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(140)

我的应用程序使用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中创建帐户之后但在创建文档之前连接中断了呢?如果由于某种原因文档创建失败了呢?那么用户将处于一种奇怪的情况,他们有一个帐户,但没有数据保存在数据库中,这意味着应用程序可能会永远加载。
所以,我想知道:是否有一种方法可以创建类似于批处理写入的东西,以便在创建文档的同时创建帐户?

c86crjj0

c86crjj01#

我想您不应该担心这个问题,因为这两个方法将在对方上运行,它们发生这种情况的可能性非常小,要么都成功,要么都失败,但是,我可以建议在这些情况下侦听authStateChanges()流,并根据它采取行动,同时使用isNew,如下所示:

// At first, we were not sure that the document exists
  bool areWeSureThatTheuserHaveDocument = false;

  // we listen to auth changes of new user
  FirebaseAuth.instance.authStateChanges().listen((user) {

     // we want this method to get triggered only when the user authenticates, we don't want it to get executed when the user signs out
     if(user != null && !areWeSureThatTheuserHaveDocument) {

     // here we create the document
       await DatabaseService(uid: user.uid).createUserData(
         name: name,
         email: email,
       );

     // now if the document does exists, it will return true, for future checks on this method it will not be executed
        areWeSureThatTheuserHaveDocument = await doesUserDocumentExists(user.uid);
     }
   });

    // this is the check document existence
     Future<bool> doesUserDocumentExists(String id) async {
       final collection = await FirebaseFirestore.instance.collection("users").get();
       return collection.docs.map((doc) => doc.id).contains(id);
      }

实际上,如果你愿意实现这段代码或类似的东西,你可能想知道,通过这段代码,你可以确保100%的用户在数据库中有一个文档,但它会花费你一个额外的阅读检查该文档的存在。

bkhjykvo

bkhjykvo2#

因为您使用google-cloud-functions进行标记,所以执行create-user-and-write-profile-document将减少您所谈论的中断类型的机会。
但我的方法通常是,在每次onAuthState更改的侦听器为用户获取一个值时编写概要文件文档,或者在此时检查文档是否存在,并在需要时创建它。

相关问题