【问题标题】:How can I access Firestore data from within a Google Cloud Function?如何从 Google Cloud Function 中访问 Firestore 数据?
【发布时间】:2021-07-22 20:45:47
【问题描述】:

这是我第一次使用 Cloud Functions。我正在尝试进行一个简单的调用来访问存储在我的 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-firestore google-cloud-functions


    【解决方案1】:

    我调整了您处理文档的方式,并且我正在从 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();
    });
    

    【讨论】:

    • 谢谢@Tim!我试过这个,但不幸的是没有骰子。您认为我可能无法连接到我的 Firestore 吗?我所看到的一切都表明我是,但我想我不能完全排除这是问题..
    • 你在使用模拟器吗?如果是这样,也许您不小心连接到生产资源?我在模拟器中测试了这段代码。另外,您是否 100% 确定这条路径上有数据?没有错别字? db.collection('企业')
    • 我绝对确定路径是正确的。我正在使用模拟器,虽然我不确定如何检查我是否连接到生产资源。那里有什么提示吗?谢谢!
    • 我知道,当您调用该函数时,它确实会提供一条关于它是生产资源的警告消息。
    【解决方案2】:

    您的getBusinesses 函数是async:然后您需要使用await 调用它。然后,由于您在 Cloud Function 中使用 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(...);
    } 
    

    跟随 cmets 更新

    你能试试这个并分享你从 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);
        }
    
    });
    

    【讨论】:

    • 感谢@Renaud Tarnec!我也试过这个,但也没有用。我在上面问蒂姆的同样问题 - 你认为我可能无法连接到我的 Firestore 吗?我所看到的一切都表明我是,但我想我不能完全排除这个问题。正如我在问题中所说,我登录到控制台我的数据库,它像我一样打印关于我的项目的数据预计。非常感谢!
    • 你能在你的云函数顶部添加一个console.log()吗?只是为了确保您正确调用它。 Cloud Function 本身调用 Firestore 应该没有任何问题。我会用更简单的代码更新答案(没有getBusinessesfunction):你能试一试吗?
    • 我试过了,我的输出显示正确。我在 Firebase Emulator Suite 中查看了这一切,但我得到了预期的日志记录。谢谢!
    • 如果部署函数会发生什么?只是为了检查它是否是模拟器的副作用。
    • 这是我的结果。 Beginning execution of "_myregion_-updateBusinessData" Function started Snapshot size = 0 Finished "_myregion_-updateBusinessData" in ~1s
    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2022-09-28
    • 2022-01-04
    • 2019-04-12
    相关资源
    最近更新 更多