我有一个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')
})
为什么只能第二次使用?
答案 0 :(得分:3)
您没有正确使用Promise。仅应在函数中的所有异步工作完成后才发送响应。现在,您正在执行查询,但是在发送响应时不等待其结果。发送该响应时,Cloud Functions将关闭您的代码,这意味着尚未完成的任何异步工作都可能永远不会完成。
此外,您不会在这样的Cloud Functions中使用on()
。如果要一次查询数据,请使用once()
,然后使用once()
返回的promise确定查询何时完成以及查询的结果。