如何在firestore中检索当前auth用户的所有字段? - 科特林

Posted

技术标签:

【中文标题】如何在firestore中检索当前auth用户的所有字段? - 科特林【英文标题】:How to retrieve all field of the current auth user in firestore? - Kotlin 【发布时间】:2021-12-30 12:37:57 【问题描述】:

如何检索当前登录用户的所有字段?

我看过很多教程和问题,其中一些讨论了整个集合,另一些讨论了类似的主题,但没有找到相关信息。

谢谢

更新

当前代码:

  fun getUserName_FireBase()
        if(userID==null)

            println("The userID is null")
            userID= getUserID()

            println("The userId has been assigned and now is: " + userID.toString())

        

        println("1")

            val db = FirebaseFirestore.getInstance()
        println("1a")
        val usersRef = db.collection("users")
        println("1b")

        usersRef.document(userID.toString()).get().addOnCompleteListener  task ->
               println("2")
               if (task.isSuccessful) 
                   println("3")
                   val document = task.result
                   if(document!!.exists())
                       println("4")
                       userName = document!!.getString("user").toString()
                        println("user is " + userName.toString())
                   else 
                       println("5")
                       Log.d("Error", "This document does not exist")

                   

               else 
                   println("6")
                   task.exception?.message?.let 
                       Log.d(TAG, it)
                   

               
               println("7")

           
        println("8")
    

控制台错误

给出错误是因为稍后我需要访问应该填写在该函数中的 userName var

【问题讨论】:

嗯。答案就在入门指南Read Data 中。你经历过吗?如果没有,《入门指南》确实是入门的最佳场所。 @Jay 阅读指南,没有帮助抱歉,我刚刚把这段代码 var result= FbReference.collection("users").document("$userID").get() 和什么也没发生,当把这一行检索用户名字段时,println("result is " +result.getResult()!!.getString("user")),它说任务还没有完成 DocumentReference.get() 返回一个任务对象。您需要添加一个完成侦听器,以便在从 firestore 获取数据时收到通知。 看到这一行println("8") 它实际上会在Firebase 闭包中执行before 代码,就像userName = document!! 这意味着userName 在闭包之外是未定义的。代码比互联网快,firebase 数据只在闭包内有效。 Firebase functions are asynchronous 所以你应该阅读它,因为它是你代码中的核心问题。 【参考方案1】:

为了能够获取用户数据,您必须创建一个指向该文档的引用,执行 get() 调用并附加一个侦听器,如以下代码行所示:

val db = FirebaseFirestore.getInstance()
val usersRef = db.collection("users")
usersRef.document("gA4z1AhkQpQ6J47sIMmCGIZRKDK2").get().addOnCompleteListener  task ->
    if (task.isSuccessful) 
        val document = task.result
        if (document.exists()) 
            val email = document.getString("email")
            val pass = document.getString("pass")
            val user = document.getString("user")
            Log.d(TAG,"$email/$pass/$user")
         else 
            Log.d(TAG, "The document doesn't exist.")
        
     else 
        task.exception?.message?.let 
            Log.d(TAG, it)   
        
    

logcat 中的结果将是:

barrooroor@gmail.com/paport/do3fe4232ef2

如果 "gA4z1AhkQpQ6J47sIMmCGIZRKDK2" 是来自身份验证过程的用户 ID,那么您可以简单地使用:

val auth = FirebaseAuth.getInstance()
val uid = auth.currentUser?.uid
usersRef.document(uid).get().addOnCompleteListener /* ... /*
//                 ?

除此之外,更重要的是,切勿将敏感数据存储为纯文本密码。恶意用户可能会利用这一点。为此始终使用Firebase Authentication 并使用Firestore Security Rules 保护数据库。

【讨论】:

感谢 Alex 的建议!我已按照您的指示进行操作,但执行代码完全忽略了它,就好像它不存在一样。我添加了带有控制台错误的当前代码,以防我可能遗漏一些东西 这个answer 会有所帮助,对吧? 不,Alex 指定的答案没有,但 jay 评论了一个您前段时间已经回答的问题,可能认为这可能是问题所在。所以,非常感谢!

以上是关于如何在firestore中检索当前auth用户的所有字段? - 科特林的主要内容,如果未能解决你的问题,请参考以下文章

如何使用firestore在当前用户文档中添加数据?

Firestore 安全规则无法检索 request.auth.token.name

Flutter - 如何从 Firestore 返回当前用户

如何使用 Flutter 中的 UserID 从 Firebase Firestore 检索数据?

如何在 Flutter 中使用 Firebase Auth 和 Firestore

Firebase 规则如何获取“request.auth.uid”字段?