Облачная функция Firebase Обновление Cron - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть функция, которую я использую для обновления базы данных на основе Cron Job.Выглядит это так (стоит сказать, что мне здесь очень помогли)

exports.minute_job =
  functions.pubsub.topic('minute-tick').onPublish((event) => { 

    var ref = admin.database().ref("comments")
    ref.once("value").then((snapshot) => {
        var updates = {};
        snapshot.forEach(commentSnapshot => {
            var comment = commentSnapshot.val();

            var currentRating = comment.rating - comment.lastRating;          
            var newScore = ((Math.abs(comment.internalScore) * 0.95) + currentRating) * -1;

            if(newScore < 0.000001) { newScore = 0.000001}

            updates[commentSnapshot.key + "/lastRating"] = comment.rating;
            updates[commentSnapshot.key + "/internalScore"] = newScore;         
        });

        ref.update(updates);
    })
  });

Все работает отлично, за исключением того, что я получаю это предупреждение из журналов Firebase:

"Функция вернула undefined,Ожидаемое обещание или значение "

Спасибо за любую помощь

1 Ответ

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

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

Решение состоит в том, чтобы вернуть обещание, которое является просто объектом, который будет сигнализировать, когдавы сделали с базой данных.Хорошая новость заключается в том, что и once(), и update() уже возвращают обещания, поэтому вы можете просто вернуть их:

exports.minute_job =
  functions.pubsub.topic('minute-tick').onPublish((event) => { 

    var ref = admin.database().ref("comments")
    return ref.once("value").then((snapshot) => {
        var updates = {};
        snapshot.forEach(commentSnapshot => {
            var comment = commentSnapshot.val();

            var currentRating = comment.rating - comment.lastRating;          
            var newScore = ((Math.abs(comment.internalScore) * 0.95) + currentRating) * -1;

            if(newScore < 0.000001) { newScore = 0.000001}

            updates[commentSnapshot.key + "/lastRating"] = comment.rating;
            updates[commentSnapshot.key + "/internalScore"] = newScore;         
        });

        return ref.update(updates);
    })
  });

Теперь облачные функции Google знают, что ваш код все еще работает после }),потому что ты вернул обещание.А затем, когда ваш update() будет выполнен, он выполнит обещание, которое он вернет, и Google Cloud Functions сможет закрыть контейнер (или, по крайней мере, прекратить взимать плату за его использование).

...