首页 > 解决方案 > 如何从我的应用程序当前登录用户的文档中检索信息?

问题描述

在注册/注册用户时,我将数据存储在每个用户文档的 3 个字段中:姓名、电子邮件和用户名。我有一个按钮,按下它会显示一条欢迎消息:“Hellow,(用户名)”,但这无法读取当前用户的用户名,即当前登录的用户,而是显示任何用户名其他随机用户。

我可以使用 Firebase Auth 读取当前用户的电子邮件,即:

Auth.auth().currentUser?.email

但我无法读取当前用户的用户名,据我所知,它没有保存在 Firebase 的身份验证端。

这是我已经尝试过的代码:

func loadUserData() {
guard let email = Auth.auth().currentUser?.email else { return }
emailString = "\(email)"



self.db.collection("users").getDocuments { (snapshot, error) in
    if let err = error {
        print("Error: \(err)")
    } else {
        for document in snapshot!.documents {
            let emailRetrieved = document.get("email") as! String
            let usernameRetrieved = document.get("username") as! String

            print("ATTEN: 658")
            self.emailString = emailRetrieved
            print(self.emailString)
            self.usernameString = usernameRetrieved
            print(self.usernameString)

        }
    }
  }
}

这正是文档所建议的。上面的代码只是打印出“用户”集合下所有文档的电子邮件和用户名。

我的文档的名称是“用户”,如果有帮助,每个用户的信息都保存在他们的个人文档中,这些名称作为他们的用户 ID。如果有人可以提供帮助,我将不胜感激,我已经在这个问题上停留了一段时间。

标签: swiftfirebasegoogle-cloud-firestore

解决方案


我建议您在文档或文档 ID 本身中创建一个字段,其中包含来自 firebase auth 的用户 uid。在这个repousersEndpoint.js看看exports.createUser.

...
usersCollection.doc(userRecord.uid).set({
                uid: userRecord.uid,
                firstname: user.firstname,
                lastname: user.lastname,                
                dateOfBirth: user.dateOfBirth,
                sex: user.sex,
                city: user.city,
                activities: user.activities,
                offers: user.offers
            })
...

使用这种方法,您可以像这样更改代码:

func loadUserData() {
...
let uid= Auth.auth().currentUser?.uid

self.db.collection("users").get(uid) { (snapshot, error) in
    if let err = error {
        print("Error: \(err)")
    } else {
        ...
    }
  }
}

这样,您应该更容易获得用户的正确文档。

对不起,我的代码不是很快。我用swift编码已经有一段时间了。但我希望这会有所帮助。

编辑

或者,您可以使用Firestore文档中描述的查询。它可能看起来像这样:

...
guard let email = Auth.auth().currentUser?.email else { return }
emailString = "\(email)"

self.db.collection("users").whereField("email", isEqualTo: emailString)
    .getDocuments() { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                print("\(document.documentID) => \(document.data())")
            }
        }
}
...

推荐阅读