typescript - Hur får man aktuell användardata från Firestore?


Jag arbetar på ett Ionic 4-projekt, där jag vill visa alla inlägg från den aktuella användaren när användaren loggar in i applikationen. För närvarande använder jag snapshotChanges() och subscribe()-metoden (som visas nedan) för att hämta data från Firestore. Men det ger mig varje enskild data från Firestore-dokumentet. Med userID och postID-referenser på båda dokumenten, hur kan jag få värdet av author och desc från just den användaren eller är det möjligt? För att vara specifik, hur kan jag visa användaren (6YbhQux2sgTH66F0cJpdcT87Pw83)s inlägg (54d039ec-5b3c-4ee9-95a0-418b06365f25) som innehåller author och desc?

Firestore: firestore-bild

Här är vad jag gjorde:

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>

Jag försökte också använda afAuth.auth.currentUser för att få det nuvarande användar-ID:t och inläggen, men det visar ett fel Property 'map' does not exist on type 'DocumentSnapshot'. Jag är ny på detta och är inte säker på hur jag ska gå vidare.

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'],
           };
         })
     })
  })

UPPDATERING

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);

Utdata: användarinfo

Svar #1

För att få "author" och "desc" för de inlägg som skapats av en användare, kan du göra följande:

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'],
    };
  }))
})

Observera att jag, för att filtrera inläggen, använder metoden .where()

Svar #2

För att få author och desc, prova följande:

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']
        };
      }));

Det verkar som att du använder angularfire, först placerar du referensen på dokumentet userid och sedan använder du snapshotChanges, som returnerar en Observable, du kan då hämta datan. Pipe är en instansmetod i Observable-klassen som används för att sammanfoga funktionella operatorer till en kedja (map är en av dessa operatorer).