Angular Firestore将文档字段作为字符串获取

问题描述

我知道有很多这样的问题,但是没有一个解决方案可以解决我的问题。 IVe坚持了一段时间,非常感谢您的帮助/指导。 我想在可观察的云存储区等概念中我缺少一些重要的东西。

主要问题::如何从Cloud Firestore数据库获取单个文档字段作为字符串? 我尝试了两种不同的方法,并给了我所需的结果:

getUsername(uid : string) {
    const user = this.afs.firestore.doc(`users/${uid}`)
    return user.get().then((doc) => {
        return (doc.exists ? doc.data().username : null);})

} //this one returns a promise and i need a string
getUsername(uid : string) {
    let answer;
    this.get(uid).valueChanges().subscribe((doc) => answer = doc.username) //intellisense reccomended username as m attribute which was hopeful
    return answer;
} //this returns undefined    
 

快速-曾经有人使用rxjs映射运算符访问对象中的字段,例如

getUsername() return userDoc.pipe(map(user => user.username))

我也尝试过这个,但是没有用。我还检查了rxjs文档,并说map的预期用途是对可观察流应用操作。可以像上面显示的那样使用吗? (如果是这样,我在做什么错?)

详细信息/背景: 我正在将Google Firebase用于身份验证和Firestore云数据库。出现问题是因为用户通过我的应用程序创建了一个用户帐户(在users集合中创建了一个新的用户文档),但是在后端,我使用firebase createuserWithEmailAndPassword方法-因此有两个单独的用户数据实例-google记录和我的应用程序。为了解决这个问题,我使用firebase.user.uid作为用户文档的uid,并在运行时将googles数据与我的应用程序数据库同步,这样,如果用户更改了自己的gmail地址,则他们的用户文档将是最新的电子邮件地址。这里的问题是我有一个单独的集合“配置文件”,用于存储用户公共配置文件和首选项数据,其中用户名用作uid,还用作url中的查询参数,例如

localhost/4200/profiles/username

因此,在此用户名必须是一个单词,不能带空格。我在创建帐户表单中对此进行了验证,但是现在有一个单独的问题-谷歌用户名可以包含空格。因此,当我将google帐户与用户文档同步时,我必须使用两个数据源。

userDoc.set({
username : from user document
email : from firebase.User.email
uid : Firebase.User.uid
})

因此,由此产生了一些问题。

  1. 如何获取单个Firestore文档字段作为字符串,而不是Promise,Observable,[object object]等??
  2. 在这种情况下,我应该回到制图板上吗?-(

非常感谢您的帮助或建议

解决方法

我会尝试使用ts

...
username:string
...

constructor(private db:FirestoreService)

...

getUsername(){
  this.db.getUsername(someUID).subscribe(
    (data) => this.username = data.exists ? data.data().username : undefined
  }
}

和FirestoreService ts

getUsername(uid : string) {
    return (this.afs.firestore.doc(`users/${uid}`).get())
}

现在要回答一些问题(通常一次只回答一个问题),您会发现许多教程在Firestore或实时数据库上都具有Firebase身份验证和特定的用户信息。

您无法在同步流中返回异步检索到的值,因此从数据库中检索后,以后总是必须使用所需的值更新应用程序。