适用于Firebase onWrite超时的云功能

Ale*_*son 11 javascript timeout firebase firebase-realtime-database google-cloud-functions

我返回事务承诺,应该在停止函数之前等待事务完成.交易执行得很好,但承诺似乎永远不会解决.

我在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;
});
Run Code Online (Sandbox Code Playgroud)

编辑:

我用以下"黑客"解决了这个问题,我自己创建了一个承诺,因为无论.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));
});
Run Code Online (Sandbox Code Playgroud)

Tho*_*din 4

旧版本的 firebase-admin SDK 存在一个已知问题,其中 Firebase 数据库引用和快照无法进行 JSON 序列化,因此无法用于 Cloud Functions 的返回值。这包括交易返回值,因为它们也有快照。

你的黑客解决了这个错误;如果您更新 firebase-admin 的版本,您也应该得到修复。

  • 感谢您验证。显然修复还不够。我们可以在另一个版本中解决这个问题。您可以同时使用上面的代码来解决这个问题。 (4认同)