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
})
因此,由此产生了一些问题。
- 如何获取单个 firestore 文档字段作为字符串,而不是 promise、observable、[object object] 等?
- 我应该重新考虑整个情况吗- (
即
- 重新设计我的数据库,使配置文件成为用户的子集合
- 找到一种无需将用户名用作路由参数即可导航到个人资料页面的方法
- 考虑一个更好的身份验证计划,这样就不需要单独的数据库 table 需要在用户登录时同步到 googles 身份验证数据
非常感谢任何帮助或建议
我会在我的组件中尝试 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 同步流中的异步检索值,您以后总是必须在从数据库中检索到所需值后更新您的应用程序。
我知道有很多这样的问题,但是 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
})
因此,由此产生了一些问题。
- 如何获取单个 firestore 文档字段作为字符串,而不是 promise、observable、[object object] 等?
- 我应该重新考虑整个情况吗- (
即
- 重新设计我的数据库,使配置文件成为用户的子集合
- 找到一种无需将用户名用作路由参数即可导航到个人资料页面的方法
- 考虑一个更好的身份验证计划,这样就不需要单独的数据库 table 需要在用户登录时同步到 googles 身份验证数据
非常感谢任何帮助或建议
我会在我的组件中尝试 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 同步流中的异步检索值,您以后总是必须在从数据库中检索到所需值后更新您的应用程序。