firebase实时数据库查询第二次

时间:2018-09-20 17:15:56

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

我有一个firebase函数来计算每日销售数量。每天晚上10点由外部服务调用此firebase http函数。 我观察到的是它返回的销售额为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')
})

为什么只能第二次使用?

1 个答案:

答案 0 :(得分:3)

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

此外,您不会在这样的Cloud Functions中使用on()。如果要一次查询数据,请使用once(),然后使用once()返回的promise确定查询何时完成以及查询的结果。

相关问题