如何使用云功能在Firestore中返回每个集合及其文档?

时间:2020-10-29 15:59:24

标签: javascript node.js firebase google-cloud-firestore

想返回一个具有[1year,1month等]的数组,而每个数组都是包含每个文档的数组。

当前,这将返回一个空数组,但是当我打印快照的大小时,将获得正确的值。不知道我是否正确使用push()还是这是一个异步问题。谢谢。

Here is an image of the database

exports.getStockPrices = functions.https.onRequest((req, res) => {
  cors(req, res, () => {
    const currentUser = {
      token: req.headers.authorization.split('Bearer ')[1]
    };
    // ! this is a post request
    admin
      .auth()
      .verifyIdToken(currentUser.token)
      .then(decodedToken => {
        // keep this just in case we want to add anything to do with the user
        const user = decodedToken;
        // array of collections e.g [1year, 1mo, etc]
        const data = [];
        // array of documents e.g [18948901, 1984010471, etc]
        const documents = [];
        db.collection('historical')
          .doc(`${req.body.ticker}`)
          .listCollections()
          .then(collections => {
            // each collection is the 1year, 1mo, etc
            collections.forEach(collection => {
              collection.get().then(querySnapshot => {
                console.log('number of documents: ' + querySnapshot.size);
                querySnapshot.forEach(doc => {
                  // doc.data is each piece of stock data
                  documents.push(doc.data());
                });
                // each document e.g 1year, 1mo, etc
                data.push(documents);
              });
            });
            return data;
          })
          .then(data => {
            return res.json({ data });
          })
          .catch(err => {
            console.log(err);
            return res.status(500).send({ error: 'error in getting data' });
          });
      })
      .catch(err => {
        console.log(err);
        return res.status(500).send({
          error: 'error authenticating user, please try logging in again'
        });
      });
  });
});

1 个答案:

答案 0 :(得分:0)

由于异步调用的性质,您的返回发生在数组被填充之前。

您可以尝试我的示例,我的firebase函数定义为async,这使我可以使用await,该语句允许通过等待诺言为Firestore操作添加一种同步。

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


admin.initializeApp();
const db = admin.firestore();

exports.eaxmple =  functions.https.onRequest(async (req, res) => {
    var datax = []

    var collections = await db.collection('collection').doc('docid').listCollections()
    for (collection in collections) {
            content =  await collections[collection].get().then(querySnapshot => {
            console.log('number of documents: ' + querySnapshot.size);
            return querySnapshot.docs.map(doc => doc.data());

        });
        datax.push(content)

    }
    return res.json({datax});


});