Angular firestore 获取文档字段作为字符串

Angular firestore get document field as string

我知道有很多这样的问题,但是 none 的解决方案解决了我的问题。 我已经坚持了一段时间,真的很感激 help/guidance。 我想我在 Observable、Cloud Firestore 等想法中遗漏了一些重要的东西......

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

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 的预期用途是将操作应用于可观察流。可以像上图那样使用吗? (如果是这样,我做错了什么?)

Details/background: 我正在使用 Google Firebase 进行身份验证和 Firestore 云数据库。出现问题是因为用户通过我的应用程序创建了一个用户帐户(在用户集合中创建了一个新的用户文档),但是在后端,我使用了 firebase createUserWithEmailAndPassword 方法 - 所以有两个单独的用户数据实例 - google记录和我的申请。为了解决这个问题,我使用 firebase.user.uid 作为用户文档的 uid,并在运行时将 googles 数据与我的应用程序数据库同步,这样如果用户更改了他们的 gmail 地址,他们的用户文档就会有最新的电子邮件地址。这里的问题是我有一个单独的集合“配置文件”,用于存储用户 public 配置文件和偏好数据,其中用户名用作 uid,并且还用作 url 中的查询参数

localhost/4200/profiles/username

所以在这里,用户名必须是一个不带空格的单词。我在创建帐户表单中验证了这一点,但现在有一个单独的问题 - google 用户名可以包含空格。因此,当我将 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 身份验证和特定用户信息。

您不能 return 同步流中的异步检索值,您以后总是必须在从数据库中检索到所需值后更新您的应用程序。