Angular firestore获取文档字段作为字符串
我知道有很多这样的问题,但没有一个解决方案能解决我的问题。 我在这个问题上纠结了一段时间,非常感谢您的帮助/指导。 我想在可观测、云火库等概念中,我遗漏了一些重要的东西 主要问题:如何从cloud firestore db获取单个文档字段作为字符串? 我尝试了两种不同的方法,尼瑟给了我需要的结果:Angular firestore获取文档字段作为字符串,angular,typescript,firebase,google-cloud-firestore,rxjs-observables,Angular,Typescript,Firebase,Google Cloud Firestore,Rxjs Observables,我知道有很多这样的问题,但没有一个解决方案能解决我的问题。 我在这个问题上纠结了一段时间,非常感谢您的帮助/指导。 我想在可观测、云火库等概念中,我遗漏了一些重要的东西 主要问题:如何从cloud firestore db获取单个文档字段作为字符串? 我尝试了两种不同的方法,尼瑟给了我需要的结果: getUsername(uid : string) { const user = this.afs.firestore.doc(`users/${uid}`) return user.
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
快速搁置-我见过人们使用rxjs映射操作符访问对象中的字段,如
getUsername()返回userDoc.pipe(map(user=>user.username))
我也试过这个,但没用。我还检查了rxjs文档,它说map的预期用途是将操作应用于可观察的流。它可以像上面所示那样使用吗?(如果是,我做错了什么?)
详细信息/背景:
我正在使用GoogleFirebase进行身份验证和Firestore云数据库。问题的出现是因为用户通过我的应用程序创建了一个用户帐户(在用户集合中创建一个新的用户文档),但在后端,我使用firebase createUserWithEmailAndPassword方法-因此有两个单独的用户数据实例-google record和我的应用程序。为了解决这个问题,我使用firebase.user.uid作为用户文档的uid,并在运行时将Google数据与我的应用程序数据库同步,这样,如果用户更改了他们的gmail地址,他们的用户文档将具有最新的电子邮件地址。这里的问题是,我有一个单独的集合“profiles”,它存储用户公共配置文件和首选项数据,其中username用作uid,也用作url中的查询参数,如
localhost/4200/profiles/username
在这里,用户名必须是一个没有空格的单词。我在createaccount表单中对此进行了验证,但现在有一个单独的问题-googleusername可以包含空格。因此,当我将google帐户与我的用户文档同步时,我必须使用两个数据源
userDoc.set({
username : from user document
email : from firebase.User.email
uid : Firebase.User.uid
})
因此,由此产生了一些问题
- 重新设计我的数据库,使概要文件成为用户的子集合
- 找到一种不使用用户名作为路由参数导航到配置文件页面的方法
- 考虑一个更好的身份验证计划,这样就不会有一个单独的db表需要在用户登录时与Google的身份验证数据同步
非常感谢您的任何帮助或建议我将在我的组件ts中尝试
...
username:string
...
constructor(private db:FirestoreService)
...
getUsername(){
this.db.getUsername(someUID).subscribe(
(data) => this.username = data.exists ? data.data().username : undefined
}
}
在消防队
getUsername(uid : string) {
return (this.afs.firestore.doc(`users/${uid}`).get())
}
现在回答几个问题(通常一次只有一个问题),您可以找到许多教程,其中既有firebase身份验证,也有firestore或实时数据库上的特定用户信息
您不能在同步流中返回异步检索的值。从db检索后,您必须始终使用所需的值更新应用程序。我会在我的组件ts中尝试
...
username:string
...
constructor(private db:FirestoreService)
...
getUsername(){
this.db.getUsername(someUID).subscribe(
(data) => this.username = data.exists ? data.data().username : undefined
}
}
在消防队
getUsername(uid : string) {
return (this.afs.firestore.doc(`users/${uid}`).get())
}
现在回答几个问题(通常一次只有一个问题),您可以找到许多教程,其中既有firebase身份验证,也有firestore或实时数据库上的特定用户信息
您不能在同步流中返回异步检索的值。从db检索后,您将始终需要使用所需的值更新应用程序。我将尝试使用全局变量并将结果分配给变量,而不是返回异步CALL。我将尝试使用全局变量并分配将结果返回给变量,而不是返回异步调用