firebase实时数据库查询第二次工作

firebase实时数据库查询第二次工作,firebase,firebase-realtime-database,google-cloud-functions,Firebase,Firebase Realtime Database,Google Cloud Functions,我有一个firebase函数,用于计算每日销售额。外部服务每晚10点调用firebase http函数。 我所观察到的是,它的销售额为0。但当我再次手动调用同一个方法时,它给出了正确的数字 为了确保外部服务调用URL的方式没有问题,我以5分钟的间隔安排了两次,比如10:00 PM和10:05 PM。结果是一样的。也就是说,晚上10:00的电话给了我总计0,10:05的电话给了我预期总计 下面是计算它的代码: exports.daily_sales_report = functions.https

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

为了确保外部服务调用URL的方式没有问题,我以5分钟的间隔安排了两次,比如10:00 PM和10:05 PM。结果是一样的。也就是说,晚上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')
})

为什么它只能第二次使用?

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


另外,您不应该在类似这样的云函数中使用
on()
。如果要一次性查询数据,请使用
once()
,然后使用
once()
返回的承诺来确定查询何时完成及其结果包含的内容。

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


另外,您不应该在类似这样的云函数中使用
on()
。如果要一次性查询数据,请使用
once()
,然后使用
once()
返回的承诺来确定查询何时完成以及查询结果包含的内容。

有意义。但是child_不是每场比赛都会被解雇一次吗?我刚核实过。当有2条匹配记录时,它会触发两次。如果是这样的话,那么在从方法返回之前,我怎么知道所有这些都完成了呢?使用“value”事件一次性获得整个结果。”child_补充道,“在云函数中没有真正意义。有意义。”。但是child_不是每场比赛都会被解雇一次吗?我刚核实过。当有2条匹配记录时,它会触发两次。如果是这样的话,那么在从方法返回之前,我怎么知道所有这些都完成了呢?使用“value”事件一次性获得整个结果。”child_补充道,“在云函数中没有真正意义。