Cloud Functions for Firebase onWrite 超时

Posted

技术标签:

【中文标题】Cloud Functions for Firebase onWrite 超时【英文标题】:Cloud Functions for Firebase onWrite timeout 【发布时间】:2017-08-26 08:03:40 【问题描述】:

我返回交易承诺,它应该在停止功能之前等待交易完成。交易执行良好,但承诺似乎永远无法解决。

我在 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;
);

编辑:

我用以下“hack”解决了这个问题,我自己创建了一个承诺,因为无论.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));
);

【问题讨论】:

这看起来像是 firebase 库本身的问题。 这个“hack”显着降低了我的云功能的执行时间。 出于某种原因,如果你打电话给then 它可以工作。示例countRef.transaction(current => .. ).then(() => console.log("Transaction finished") ) 【参考方案1】:

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

您的 hack 可以解决该错误;如果你更新你的 firebase-admin 版本,你也应该得到修复。

【讨论】:

好的,将尝试在4.1.4 更新到最新的firebase-admin,我正在使用版本4.1.3 BTW 我在使用最新版本 4.1.4 时遇到了同样的问题。我按照提供的示例进行操作:github.com/firebase/functions-samples/blob/master/child-count/… 我可以确认 firebase-admin 4.1.4firebase-functions 0.5.4 仍然存在问题 感谢您的验证。显然修复是不够的。我们可以在另一个版本中解决它。您可以同时使用上面的代码解决它。 云函数的下一个后端更新应该为所有可能的返回类型修复此问题(而不是超时云函数将记录警告并完成)。

以上是关于Cloud Functions for Firebase onWrite 超时的主要内容,如果未能解决你的问题,请参考以下文章