首页 > 解决方案 > 从 firebase 集合中获取文档对象

问题描述

刚开始使用 Firebase 云,我被困住了。我希望解决方案是一个简单的解决方案,但到目前为止我无法解决它。

我使用模型创建了一个项目(https://github.com/DragosB88/vending-machine),但现在我想使用firebase。所以我在firebase cloud上创建了一个项目,并在那里创建了一个集合和一个对象文档:

// SET FIRESTORE PRODUCTS - function inside service
setDBProducts(data) {
       this.firestore
           .collection('vendingProducts') // collection name on Cloud Firestore
           .doc('products')               // document name on Cloud Firestore
           .set(Object.assign({}, data)); // it only accepts objects, thus arrays must be converted
    }

效果很好:

火力基地数据

问题是,当我尝试检索数据时,我得到了不同的对象(取决于我提出的请求),这些对象不包含 firebase 上的任何数据。

  // GET FIRESTORE PRODUCTS - service function
  getDBProducts() {
    return this.firestore.collection('vendingProducts').doc('products').get();
  }
  
  // ---------------------------------------------------------------
  // GET FIRESTORE PRODUCTS - component function inside constructor

 this.dbProducts = ProductsService.getDBProducts().subscribe(
    (res) => (this.dbProducts = res)
 );
 // this.dbProducts = ProductsService.getDBProducts();
 console.log('DATABASE PRODUCTS: ', this.dbProducts);

这是我订阅后收到的

如何从 firebase 获取产品?(顺便说一句,我也是可观察的新手)

标签: angularfirebasegoogle-cloud-firestorecrud

解决方案


数据从 Firebase 异步加载。任何需要访问数据的代码都需要在您的subscribe回调中(或从那里调用)。

在您当前的代码中,当您console.log('DATABASE PRODUCTS: ', this.dbProducts)运行时,this.dbProducts = res尚未执行。

所以这是一种解决方案:

 this.dbProducts = ProductsService.getDBProducts().subscribe((res) => {
    this.dbProducts = res;
    console.log('DATABASE PRODUCTS: ', this.dbProducts);
 });

推荐阅读