Подтвердить что ты не робот

Облачные функции для Firebase onWrite timeout

Я возвращаю транзакционное обещание, которое должно дождаться завершения транзакции до остановки функции. Транзакция выполняется отлично, но обещание, похоже, никогда не будет разрешено.

В консоли Firebase я вижу, что эта функция всегда истекает через 60 секунд.

const functions = require('firebase-functions');
const admin = require("firebase-admin");
const db = admin.database();


export let countFollowers = functions.database.ref('followers/{followee}/{follower}').onWrite(event => {
    const followee = event.params.followee;
    let path = `posts/${followee}/cnt_foll`;
    const countRef = db.ref(path);
    let out = countRef.transaction(current => {
        if (event.data.exists() && !event.data.previous.exists()) {
            return (parseInt(current) || 0) + 1;
        } else if (!event.data.exists() && event.data.previous.exists()) {
            return (parseInt(current) || 0) - 1;
        }
    });

    return out;
});

EDIT:

Я решаю проблему со следующим "взломом", я сам создаю обещание, потому что все, что возвращается .transaction, не работает:

return new Promise(function(resolve, reject) {
    countRef.transaction(current => {
        if (event.data.exists() && !event.data.previous.exists()) {
            return (parseInt(current) || 0) + 1;
        } else if (!event.data.exists() && event.data.previous.exists()) {
            return (parseInt(current) || 0) - 1; 
        }
    }, () => resolve(null));
});
4b9b3361

Ответ 1

Известна проблема со старыми версиями SDK firebase-admin, где ссылки и снимки базы данных Firebase не могут быть сериализованы JSON и поэтому не могут использоваться в возвращаемых значениях для функций облака. Это включает в себя значения возврата транзакции, так как они также имеют моментальные снимки.

Ваш хак работает вокруг ошибки; вы также должны получить исправление, если обновите версию firebase-admin.