Как мне получить простую строку из коллекции в firebase firestore в проекте angular

#firebase #google-cloud-firestore #angular7

#firebase #google-облако-firestore #angular7

Вопрос:

Я пытаюсь извлечь поле из firebase firestore в проекте angular7, а затем сохранить его в строковой переменной. Мне нужно использовать функцию ‘where’, но это вынуждает меня использовать наблюдаемые, и, будучи новичком в angular, я не могу понять, как извлечь нужную строку.

Я провел исследование, которое привело меня к предоставленному коду, но без успеха в том, чего я хочу достичь. Как опытный разработчик sql, это действительно расстраивает.

 getUserPrivilegeByUserId(uid:string){
    var data;
     this.db.collection('users', ref => { return ref.where('uid','==',uid)}).snapshotChanges().subscribe(result => {  
      result.forEach(doc =>{
        data = doc.payload.doc.get("privileges");
      })
     }
    );
    return data;
  }
  

Ответ №1:

Работа с наблюдаемыми является асинхронной, поэтому в вашем примере строка «return data;» будет выполнена задолго до выполнения «data = doc.payload.doc.get(«привилегии»);».

Если метод getUserPrivilegeByUserId() находится в компоненте, подход к решению этой проблемы будет заключаться в том, чтобы установить данные в качестве свойства для компонента, а затем обновить его в subscribe, вот так:

   data: string;

  ...

  getUserPrivilegeByUserId(uid:string){
    this.db.collection('users', ref => { return ref.where('uid','==',uid)}).snapshotChanges().subscribe(result => {  
      result.forEach(doc =>{
        this.data = doc.payload.doc.get("privileges");
      })
     }
    );
  }
  

Если, с другой стороны, метод getUserPrivilegeByUserId() находится в сервисе, вы могли бы вернуть наблюдаемое из сервиса следующим образом:

   import { map } from 'rxjs/operators';

  ...

  getUserPrivilegeByUserId(uid:string): Observable<string>{
    return this.db.collection('users', ref => { return ref.where('uid','==',uid)}).snapshotChanges()
      .pipe(
        map(result => {  
          var data;
          result.forEach(doc =>{
            data = doc.payload.doc.get("privileges");
          });
          return data;
         })
      );
  

И затем в вашем компоненте вы сделаете что-то вроде:

   data: string;

  ...

  this.userService.getUserPrivilegeByUserId(uid).subscribe(data => this.data = data);
  

Комментарии:

1. Спасибо, я полностью проигнорировал асинхронную логику, хотя прочитал ее 100 раз.