У меня есть функция, которую я использую для обновления моей базы данных на основе 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:

«Функция вернула неопределенное, ожидаемое обещание или значение»

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

0
CosmicSeizure 23 Сен 2018 в 01:47

1 ответ

Лучший ответ

Поскольку ваша облачная функция не возвращает значение, движок 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 Cloud Functions знает, что ваш код все еще работает после }), потому что вы вернули обещание. А затем, когда ваш update() готов, он выполняет обещание, которое он возвращает, и Google Cloud Functions может закрыть контейнер (или, по крайней мере, прекратить взимать с вас плату за его использование).

2
Frank van Puffelen 22 Сен 2018 в 22:58