【问题标题】:How to get data from Firestore without a Subscription如何在没有订阅的情况下从 Firestore 获取数据
【发布时间】:2018-09-06 19:39:19
【问题描述】:

我正在尝试使用 angularfire2 / angular 6 为 Firestore 中的特定用户获取单个元素(路径)。

我目前将图像存储到 Firestore 数据库中。然后,我使用用户 UID 和文件路径将记录添加到 Firestore 数据库中。

我试图通过查找用户 UID 来获取单个项目(路径)。我知道如何在 Firestore 中使用查询。我想在没有订阅的情况下获取路径。

有人知道如何在没有订阅的情况下从 Firestore 中提取数据吗?

getUserImage(uid) {
      const imageRef = this.afs.collection('/users', ref => ref.where('userUID', '==', uid));
      return imageRef.snapshotChanges().pipe(map(results1 => {
        return results1.map((x) => {
          return x.payload.doc.data() as User;
        });
       }));
    }

示例:如果我要提取有关单个用户的信息;我可以在没有订阅的情况下执行此操作吗?

【问题讨论】:

  • 不确定你是否明白你在问什么
  • 有没有办法在不使用 .subscribe 的情况下从 FireStore 获取数据?

标签: angular google-cloud-firestore


【解决方案1】:

您可以将普通的旧 JavaScript API 用于 getting a document。它公开了一个 get() 方法,该方法执行一次文档检索。来自链接的文档:

var docRef = db.collection("cities").doc("SF");

docRef.get().then(function(doc) {
    if (doc.exists) {
        console.log("Document data:", doc.data());
    } else {
        // doc.data() will be undefined in this case
        console.log("No such document!");
    }
}).catch(function(error) {
    console.log("Error getting document:", error);
});

您只需要一个 Firestore 数据库实例即可开始使用。

【讨论】:

  • 我在使用 .get 时收到一条错误消息,指出“[ts] Property 'get' does not exist on type 'AngularFirestoreCollection'.”
  • 您需要一个常规的 CollectionReference 对象,而不是围绕它的 Angular 包装器。也许有一些方法可以用来获取底层的 CollectionReference?
  • 我会在这方面做更多的工作并发布我的结果。谢谢!
【解决方案2】:

从 FireStore 集合中获取数据的唯一方法是通过订阅;但是,您可以使用 RXJS 命令在订阅之前操作数据流。 一个例子是:

在本例中,this.afs 引用了我的 AngularFireStore,然后我开始收集特定用户的信息。然后我运行 FirebaseStore 提供的 snapshotChanges() 函数。

现在,为了获取您正在寻找的特定数据,您希望使用 .pipe 启动所有 RXJS 6。把它想象成隧道里的马里奥。你先从管道开始。 现在您想使用 MAP 运算符来更改您想要的内容。在这种情况下,我想映射然后获取有效负载。

现在您可以运行 .data() 函数来返回所有数据;但是,我运行 .get 数据,因为我只想返回特定数据。

一旦你决定了你想要什么,你就可以订阅它,它将返回你在管道中指定的内容。

  loadUser(user) {
    this.afs.doc<any>(`users/${user}`).snapshotChanges().pipe(
      map(actions => {
        console.log('Getting image reference from user');
        const imageRef = actions.payload.get('appPhotoRef');
        console.log(imageRef);
        return imageRef;
      })
      ).subscribe((data) => {
      console.log('Getting download URL');
      console.log(data);
      return this.getDownloadURL(data);
    });
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    相关资源
    最近更新 更多