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