【问题标题】:Read whole node from Firebase Database从 Firebase 数据库中读取整个节点
【发布时间】:2022-01-05 14:59:34
【问题描述】:

分类:

数据库:

我正在尝试读取整个选定的节点(类别),然后过滤它们并将它们返回到云可调用函数中。如何获取所有数据然后对其进行过滤?当我尝试记录数组时,它是空的。

exports.getRecipes = functions.region('europe-west1').https.onCall((data, context) => {

    categories = data.categories;



    eventsData = [];

    for (let i = 0; i < categories.length; i++) {
        admin.database().ref(categories[i]).once('value', (data) => {
            eventsData.push(data.val());
        });
    }

    console.log(eventsData);


    return "hello";

});

有没有其他方法可以通过 admin.database().ref() 获取整个节点,而不需要 .once()?

【问题讨论】:

    标签: node.js firebase-realtime-database google-cloud-functions


    【解决方案1】:

    数据是从 Firebase(和大多数现代云 API)异步加载的,在加载数据的同时,您的其余代码会继续运行。如果您在代码中添加一些日志记录,这是最容易看到的:

    console.log("Before starting to load data")
    
    for (let i = 0; i < categories.length; i++) {
        admin.database().ref(categories[i]).once('value', (data) => {
            console.log("Got data")
        });
    }
    
    console.log("After starting to load data")
    

    当你运行这段代码时,输​​出是:

    开始加载数据之前

    开始加载数据后

    得到数据

    得到数据

    ...

    这可能是您期望输出的顺序,但它解释了为什么您的 console.log(eventsData) 显示一个空数组:当您记录数组时,尚未加载任何数据并且 eventsData.push(data.val())没有运行。


    解决方案总是相同的:任何需要异步调用数据的代码,要么直接在回调内部,要么从那里调用,要么以其他方式同步。

    由于您要加载多个节点,我们将在此处使用Promise.all 等待所有这些节点都已加载。

    exports.getRecipes = functions.region('europe-west1').https.onCall((data, context) => {
        const categories = data.categories;
        const eventsData = Promise.all(categories.map((category) => {
            return admin.database().ref(categories[i]).once('value').then((snapshot) => {
                return snapshot.val();
            });
        });
    
        return eventsData;
    });
    

    由于我们现在返回一个 Promise,Cloud Functions 将等待该 Promise 解决,然后将结果值返回给调用者。

    我建议在以下位置了解有关 Promise 和异步行为的更多信息:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 2022-09-14
      • 2018-02-16
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      相关资源
      最近更新 更多