如何在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 安全规则无法检索 request.auth.token.name
Flutter - 如何从 Firestore 返回当前用户
如何使用 Flutter 中的 UserID 从 Firebase Firestore 检索数据?