如何从firestore获取当前用户数据?

Posted

技术标签:

【中文标题】如何从firestore获取当前用户数据?【英文标题】:How to get current user data from firestore? 【发布时间】:2020-02-21 14:45:36 【问题描述】:

我正在开发一个 Ionic 4 项目,我想在用户登录应用程序后显示当前用户的所有帖子。目前,我正在使用snapshotChanges()subscribe() 方法(如下所示)从firestore 获取数据。但它为我提供了 firestore 文档中的每一个数据。在两个文档上都有userIDpostID 引用,我如何从该特定用户那里获得authordesc 的值,或者有可能吗? 具体来说,如何显示user(6YbhQux2sgTH66F0cJpdcT87Pw83)的帖子(54d039ec-5b3c-4ee9-95a0-418b06365f25)包含authordesc

Firestore:firestore image

这就是我所做的:

getData.service.ts

import  Injectable  from '@angular/core';
import  AngularFirestore  from '@angular/fire/firestore';

@Injectable(
    providedIn: 'root'
  )
export class getData  
    constructor(
      private firestore: AngularFirestore
    )  

    readData()      
      return this.firestore.collection('promotions').snapshotChanges();
    

post.ts

import  AngularFirestore  from '@angular/fire/firestore';

@Component(
  selector: 'app-post',
  templateUrl: './post.page.html',
  styleUrls: ['./post.page.scss'],
)
export class PostPage implements OnInit 
 constructor(
     private afs: AngularFirestore
 )


ngOnInit() 

this.getData.readData().subscribe(data => 

  this.posts = data.map(e => 

    return 
      id: e.payload.doc.id,
      Author: e.payload.doc.data()['author'],
      Description: e.payload.doc.data()['desc'],
    ;

  )
  console.log(this.posts);
 );
 

post.html

<ion-card no-padding *ngFor="let post of posts">
    <ion-card-header>
      <ion-card-title>post.Author</ion-card-title>
    </ion-card-header>
    <ion-card-content>
      <p> post.Description </p>
    </ion-card-content>
</ion-card>

我也尝试使用afAuth.auth.currentUser 获取当前用户ID 和帖子,但它显示错误Property 'map' does not exist on type 'DocumentSnapshot'。我是新手,不知道如何继续。

let user = this.afAuth.auth.currentUser;
uid = user.uid;

this.afs.firestore.collection('users').doc(uid).get()
    .then(doc=>
       var a = doc.data().posts
       console.log(a);
       this.afs.firestore.collection('posts').doc()
       .get().then(doc2=>
         this.promotions = doc2.map(e=>
           return 
             id: e.payload.doc2.id,
             Author: e.payload.doc2.data()['author'],
             Description: e.payload.doc2.data()['desc'],
           ;
         )
     )
  )

更新

let user = this.afAuth.auth.currentUser;
uid = user.uid;

   const docs = this.afs.collection('users');
     const userinfo = docs.snapshotChanges()
     .pipe( 
       map(actions => 
         actions.map(a => 
            const data = 
             a.payload.doc.data(); 
             const id = a.payload.doc.id; 
             const Author = a.payload.doc.data()['author']
             return  id, data, Author
           ; 
        )
       ) 
     );
     console.log(userinfo);

输出:userInfo

【问题讨论】:

嗨@CODEr,根据屏幕截图,我不太确定您是否正确访问了数据。我认为您可能需要仔细检查指向您尝试访问的文档的参考。如果您从posts 集合中获取数据,最终目标是获取authordesc 字段。您需要参考您的 postID 文档,以便您可以访问这些字段。另一方面,当访问users 集合并尝试访问包含0 字段的posts 映射时,您需要确定哪个userID 文档。您需要知道 documentID。 @sllopis 嗨,我想要得到的是用户(6YbhQux2sgTH66F0cJpdcT87Pw83) 生成的posts 集合字段authordesc 【参考方案1】:

为了获取用户创建的帖子的“作者”和“描述”,您可以执行以下操作:

let user = this.afAuth.auth.currentUser;
uid = user.uid;


this.afs.firestore.collection('posts').where('user', '==', uid).get().then(posts => 
  postsCreatedByUser = posts.docs.map(e => 
    return 
      Author: e.data()['author'],
      Description: e.data()['desc'],
    ;
  ))
)

请注意,为了过滤帖子,我使用 .where() 方法

【讨论】:

【参考方案2】:

要获取authordesc,请尝试以下操作:

let user = this.afAuth.auth.currentUser;
uid = user.uid;

const docs = this.afs.collection('users');
    const userInfo = docs.snapshotChanges().pipe(
      map(data => 
        return 
          id: data.payload.doc.id,
          Author: data.payload.doc.data()['author']
          Description: data.payload.doc.data()['desc']
        ;
      ));

你好像在用angularfire,先把引用放在文件userid,然后用snapshotChanges,返回一个Observable,就可以取回数据了。 PipeObservable 类中的一个实例方法,用于将功能运算符拼接成一个链(map 是这些运算符之一)。

【讨论】:

您好,我尝试了您的解决方案,但显示错误Property 'snapshotChanges' does not exist on type 'DocumentReference' 你的代码中afs是什么,它的类型应该是AngulareFirestoregithub.com/angular/angularfire/blob/master/docs/firestore/… 嗨,它是 AngularFirestore。我的代码import AngularFirestore from '@angular/fire/firestore'private afs: AngularFirestore 收到此错误Property 'payload' does not exist on type 'DocumentChangeAction&lt;unknown&gt;[]' 试试docs.snapshotChanges().pipe( map(actions =&gt; actions.map(a =&gt; const data = a.payload.doc.data(); const id = a.payload.doc.id; return id, ...data ; )) );

以上是关于如何从firestore获取当前用户数据?的主要内容,如果未能解决你的问题,请参考以下文章

实时获取当前登录用户的数据 - Flutter & Firestore

如何按文档 ID 从 Firebase Firestore 获取数据 - iOS?

如何将我的数据从 Firestore 转换为身份验证用户

当文档ID等于Flutter中当前记录的用户ID时获取firestore数据?

您如何获取与 Firestore 中的 authUser 相关的用户数据库详细信息?

如何使用firestore在当前用户文档中添加数据?