问题描述
我知道有很多这样的问题,但是没有一个解决方案可以解决我的问题。 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
})
因此,由此产生了一些问题。
即
- 重新设计数据库,以便配置文件是用户的子集合
- 找到一种无需使用用户名作为路由参数即可导航到个人资料页面的方法
- 想出一个更好的身份验证计划,以便没有一个单独的数据库表,只要用户登录,该表就需要同步到googles auth数据中
非常感谢您的帮助或建议
解决方法
我会尝试使用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身份验证和特定的用户信息。
您无法在同步流中返回异步检索到的值,因此从数据库中检索后,以后总是必须使用所需的值更新应用程序。