Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular firestore获取文档字段作为字符串_Angular_Typescript_Firebase_Google Cloud Firestore_Rxjs Observables - Fatal编程技术网

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

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.

我知道有很多这样的问题,但没有一个解决方案能解决我的问题。 我在这个问题上纠结了一段时间,非常感谢您的帮助/指导。 我想在可观测、云火库等概念中,我遗漏了一些重要的东西

主要问题:如何从cloud firestore db获取单个文档字段作为字符串? 我尝试了两种不同的方法,尼瑟给了我需要的结果:

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
})
因此,由此产生了一些问题

  • 如何将单个firestore文档字段作为字符串而不是承诺、可观察、[对象]等获取
  • 我是否应该重新考虑整个情况-(
    • 重新设计我的数据库,使概要文件成为用户的子集合
    • 找到一种不使用用户名作为路由参数导航到配置文件页面的方法
    • 考虑一个更好的身份验证计划,这样就不会有一个单独的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。我将尝试使用全局变量并分配将结果返回给变量,而不是返回异步调用