【问题标题】:firebase realtime Database query works 2nd timefirebase 实时数据库查询第二次工作
【发布时间】:2019-02-25 01:31:51
【问题描述】:

我有一个计算每日销售额的 firebase 函数。这个 firebase http 函数每晚 10 点由外部服务调用。 我观察到的是它返回的销售额为 0。但是当我再次手动调用相同的方法时,它给出了正确的数字。

为了确保外部服务调用 URL 的方式没有问题,我每隔 5 分钟安排了两次。比如晚上 10:00 和晚上 10:05。结果是一样的。也就是说,晚上 10:00 的电话给我的总数为 0,而 10:05 的电话给我的预期总数。

下面是计算它的代码:

exports.daily_sales_report = functions.https.onRequest((req, res) => {
    var date = new Date()
    var dateStr = date.getDate() + '-' + (date.getMonth()+1) + '-' + date.getFullYear()
    //query data from firebase
    var db = admin.database();
    var ref = db.ref('orders')
    //dateStr = "11-9-2018"
    var totalSale = 0  //total sale amount

    ref.orderByChild("order/_date").equalTo(dateStr).on("child_added", function(snapshot) {
        totalSale = totalSale + snapshot.val().order._orderTotal
    })

    console.log("total final sale:" + totalSale)

    res.status(200).send('email sent')
})

为什么它只工作第二次?

【问题讨论】:

    标签: firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    您没有正确使用 Promise。您应该仅在函数中的所有异步工作完成后发送响应。现在,您正在执行查询,但在发送响应时并未等待其结果。当您发送该响应时,Cloud Functions 将关闭您的代码,这意味着任何尚未完成的异步工作可能永远不会完成。

    另外,您不应该在这样的 Cloud Functions 中使用 on()。如果要单次查询数据,请使用once(),然后使用once() 返回的promise 来确定查询何时完成以及查询结果包含什么。

    【讨论】:

    • 有道理。但是每场比赛不会触发一次 child_added 吗?我刚刚证实了这一点。它会触发两次,因为有 2 个匹配的记录。所以如果是这样的话,那么在从方法返回之前我怎么知道所有这些都完成了?
    • 使用 'value' 事件一次性获得全部结果。 'child_added' 在 Cloud Functions 中实际上没有意义。
    猜你喜欢
    • 1970-01-01
    • 2019-05-01
    • 2021-10-13
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多