【问题标题】:Reading collection from Firestore with Cloud Function使用 Cloud Function 从 Firestore 读取集合
【发布时间】:2021-03-01 07:57:26
【问题描述】:

我正在尝试使用云功能在 Firestore 中获取我的集合“Cities”中的文档,该集合与教程相同。

'use strict';

const admin = require('firebase-admin');

admin.initializeApp({
    credential: admin.credential.applicationDefault()
});

var db = admin.firestore();
var test ;
exports.helloWorld = (req, res) => {
var citiesRef = db.collection('cities/');
var allCities = citiesRef.get()
    .then(snapshot => {
        snapshot.forEach(doc => {
            //console.log(doc.id, '=>', doc.data());
            test = doc.data();
            res.status(200).send("Data");
        });
    })
    .catch(err => {
        console.log('Error getting documents', err);
    });
  let message = req.query.message || req.body.message || 'Hello World!';
  res.status(200).send(test);
};

问题是快照是空的,所以它没有返回我的响应消息。读取云功能集合中所有数据的正确方法是什么?

【问题讨论】:

    标签: javascript google-cloud-firestore google-cloud-functions


    【解决方案1】:

    您必须仅在从数据库获取数据时发送响应。

    exports.helloWorld = (req, res) => {
        var citiesRef = db.collection('cities');
        var allCities = citiesRef.get()
            .then(snapshot => {
    
                if (snapshot.empty) {
                    return res.status(404).send("No data to found");
                } 
    
                // create data array
                const snapshotData = [];
    
                snapshot.forEach(doc => {
                    test = doc.data();
    
                    // put data into the array
                    snapshotData.push(test);
                });
    
                // send response with all data
                res.status(200).send(snapshotData);
            })
            .catch(err => {
                console.log('Error getting documents', err);
                res.status(500).send(err);
            });
        };
    

    【讨论】:

    • 测试函数导致“找不到数据”。为什么会这样?我里面确实有收集和数据。
    • 我的 DB prnt.sc/vl7a89 的屏幕截图。我怀疑我的功能有问题。看到查询集合中数据的工作代码会很棒。
    • 下载服务账户文件并用它初始化App。 Follow this document
    【解决方案2】:

    在我看来,您拨打res.send() 的电话都不是很好。整个函数只能调用一次。您有一个在循环中(如果查询返回多个文档,这会很糟糕),另一个发送响应 before 查询发生任何事情,这是异步的。调用 then 不会暂停程序 - 它只是立即返回一个新的承诺。 (为了有效地使用 Cloud Functions,您肯定必须了解 JavaScript 承诺的工作原理,否则将无法按预期工作。)

    尝试类似的方法,在查询完成后只发送一个响应,在这种情况下还发送错误响应。

    exports.helloWorld = (req, res) => {
      var citiesRef = db.collection('cities/');
      var allCities = citiesRef.get()
        .then(snapshot => {
            snapshot.forEach(doc => {
                //console.log(doc.id, '=>', doc.data());
                test = doc.data();
            });
            res.status(200).send(test);
        })
        .catch(err => {
            console.log('Error getting documents', err);
            res.status(500).send("Some error");
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2020-01-11
      • 2021-03-06
      • 2018-11-19
      • 2021-06-30
      • 2020-04-12
      • 2018-06-22
      • 2020-02-03
      • 2019-04-30
      • 1970-01-01
      相关资源
      最近更新 更多