如何从 Google Cloud Function 中访问 Firestore 数据?

问题描述 投票:0回答:2

这是我第一次使用云函数。我试图进行一个简单的调用来访问存储在我的 Firestore 集合中的所有企业,但是当我尝试记录结果时,我总是得到一个空数组。

Firebase/store 的所有内容均已正确设置,集合名称已正确列出,并且已通过记录 db 确认对数据库的访问。我的代码有明显的问题吗?谢谢!

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access Firestore.
const admin = require('firebase-admin');
admin.initializeApp();


exports.updateBusinessData = functions.https.onRequest((request, response) => {
  const db = admin.firestore()

  const businessesReference = db.collection('businesses')
  var businesses = []

  const getBusinesses = async () => {
    const businessData = await businessesReference.get()

    businesses = [...businessData.docs.map(doc => ({...doc.data()}))]

    for (let business in businesses) {
      console.log(business)
    }

    response.send("Businesses Updated")

  }

  getBusinesses()
});
javascript firebase google-cloud-platform google-cloud-firestore google-cloud-functions
2个回答
0
投票

我调整了您处理文档的方式,并且我从 firestore 获取了正确的数据。

exports.updateBusinessData = functions.https.onRequest((request, response) => {
  const db = admin.firestore();

  const businessesReference = db.collection("businesses");
  const businesses = [];

  const getBusinesses = async () => {
    const businessData = await businessesReference.get();

    businessData.forEach((item)=> {
      businesses.push({
        id: item.id,
        ...item.data(),
      });
    });

    // used for of instead of in
    for (const business of businesses) {
      console.log(business);
    }

    response.send(businesses);
  };
  
  getBusinesses();
});

0
投票

您的

getBusinesses
函数是
async
:然后您需要使用
await
来调用它。然后,由于您在云函数中使用了
await
,因此您需要声明它
async

以下应该可以解决问题(未经测试):

exports.updateBusinessData = functions.https.onRequest(async (request, response) => {

    try {
        const db = admin.firestore()

        const businessesReference = db.collection('businesses')
        var businesses = []

        const getBusinesses = async () => {
            const businessData = await businessesReference.get()

            businesses = businessData.docs.map(doc => doc.data());

            for (let business in businesses) {
                console.log(business)
            }
        }

        await getBusinesses();
        // Send back the response only when all the asynchronous
        // work is done => This is why we use await above
        response.send("Businesses Updated")
        
    } catch (error) {
        response.status(500).send(error);
    }

});

您可能会更新

for (let business in businesses)
循环中的文档以使用
await
。将其更改为
for … of
循环,如下所示:

for (const business of businesses) {
    await db.collection('businesses').doc(...business...).update(...);
} 

根据评论更新

您可以尝试一下这个并分享您从 console.logs 中获得的内容吗?

exports.updateBusinessData = functions.https.onRequest(async (request, response) => {

    try {

        console.log("Function started");
        const db = admin.firestore()

        const businessesReference = db.collection('businesses');
        const businessData = await businessesReference.get();
        console.log("Snapshot size = " + businessData.size);
        const businesses = businessData.docs.map(doc => doc.data());
        for (const business of businesses) {
            console.log(business);
        }
        response.send("Businesses Updated")

    } catch (error) {
        console.log(error);
        response.status(500).send(error);
    }

});
© www.soinside.com 2019 - 2024. All rights reserved.