Как получить текущие данные пользователя из магазина? - PullRequest
0 голосов
/ 25 октября 2019

Я работаю над проектом Ionic 4, в котором я хочу отобразить все сообщения от текущего пользователя, как только пользователь войдет в приложение. В настоящее время я использую методы snapshotChanges() и subscribe() (как показано ниже), чтобы получить данные из магазина. Но это дает мне все данные из документа пожарного магазина. Имея ссылки userID и postID на оба документа, как я могу получить значения author и desc от этого конкретного пользователя или это возможно? В частности, как я могу отобразить сообщение пользователя (6YbhQux2sgTH66F0cJpdcT87Pw83) (54d039ec-5b3c-4ee9-95a0-418b06365f25), содержащее author и desc?

Firestore: изображение firestore

Вот что я сделал:

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, чтобы получить текущий идентификатор пользователя и сообщения, но он показывает ошибку 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

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Чтобы получить "автора" и "описания" сообщений, созданных пользователем, вы можете сделать следующее:

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

0 голосов
/ 25 октября 2019

Чтобы получить author и desc, попробуйте следующее:

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, вы можете получить данные. Pipe - это метод экземпляра в классе Observable, который используется для объединения функциональных операторов в цепочку (map является одним из этих операторов).

...