запрос базы данных в реальном времени firebase работает 2 раза - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть функция firebase, которая вычисляет количество ежедневных продаж.Эта http-функция firebase вызывается внешней службой каждую ночь в 10 вечера.То, что я заметил, было то, что он возвращал продажи как 0. но когда я вручную вызвал тот же метод еще раз, он дал правильное число.

Чтобы убедиться, что проблема не связана с тем, как внешняя служба вызывает URL-адрес, который я запланировал дважды, с интервалом в 5 минут.как 10:00 вечера и 10:05 вечера.И результаты такие же.То есть звонок в 22: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')
})

почемуэто работает только 2-й раз?

1 Ответ

0 голосов
/ 20 сентября 2018

Вы не правильно используете обещания.Вы должны отправлять ответ только после того, как вся асинхронная работа завершена в вашей функции.Прямо сейчас вы выполняете запрос, но не ожидаете его результатов при отправке ответа.Когда вы отправите этот ответ, Cloud Functions закроет ваш код, что означает, что любая асинхронная работа, которая еще не выполнена, может никогда не завершиться.

Кроме того, вы не должны использовать on() в облачных функциях, подобных этой,Если вы хотите запросить данные один раз, используйте once(), затем используйте обещание, возвращаемое once(), чтобы определить, когда запрос завершен и что содержат его результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...