Как преобразовать снимок запроса из Firebase в другой объект? - PullRequest
1 голос
/ 05 мая 2020

В приведенном ниже методе я получаю документ из коллекции Firebase.

Мне удалось зарегистрировать значения, которые мне нужно вернуть, когда вызывается getUserByUserId(), но мне нужно вернуть их как User объект:

getUserByUserId(userId: string) {
    return of(firebase.firestore().collection("users").where("userId", "==", userId)
      .get().then(querySnapshot => {
        querySnapshot.forEach(doc => {
          console.log("User ID", "=>", doc.data().userId);
          console.log("Username", "=>", doc.data().userName);
          console.log("Mechanic", "=>", doc.data().isMechanic);
          console.log("Location", "=>", doc.data().location);
        })
      }).catch(err => {
        console.log(err);
      }));
  }

Вот структура User, которой должны будут следовать данные:

import { PlaceLocation } from './location.model';

export class User {
    constructor(
        public id: string,
        public name: string,
        public isMechanic: boolean,
        public email: string,
        public location: PlaceLocation
    ) { }
}

Кто-нибудь, пожалуйста, скажите мне, как я могу создать User объект с этими данными и вернуть его как ответ getUserByUserId()?

1 Ответ

1 голос
/ 05 мая 2020

с @ angular / fire вы можете сделать следующее

constructor(private firestore: AngularFirestore) {
}

getUserByUserId(userId: string) {

    return this.firestore
      .collection("users", ref => ref.where("userId", "==", userId))
      .get()
      .pipe(
        filter(ref => !ref.empty),
        map(ref => ref.docs[0].data() as User),
        map(data => new User(data, data.location))
      )

}

обновлено

если вам нужен экземпляр объекта, у вас должен быть дополнительный конструктор, подобный этому о назначении объекта

export class User {
    constructor(
        public id: string,
        public name: string,
        public contactNumber: number,
        public isMechanic: boolean,
        public email: string,
        public password: string,
        public address: string,
        public imageUrl: string,
        public location: PlaceLocation
    ) { }

    public constructor(
      init?: Partial<User>,
      initLocation?: Partial<PlaceLocation>) {

        Object.assign(this, init);
        if(initLocation) {
          this.location = new PlaceLocation(initLocation);
        }
    }
}

export class PlaceLocation {
    constructor() { }

    public constructor(init?: Partial<PlaceLocation>) {
        Object.assign(this, init);
    }
}

, поскольку вы читаете данные как объект без типа, вы можете только явно создать новый объект User и назначить ему свойства, используя данные из объекта

getUserByUserId(userId: string) {

    return this.firestore
      .collection("users", ref => ref.where("userId", "==", userId))
      .get()
      .pipe(
        filter(ref => !ref.empty),
        map(ref => ref.docs[0].data() as User),
        map(data => new User(data, data.location))
      )

}
...