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 超时的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase Cloud Functions 测试中模拟 FCM admin.messaging().sendToDevice() 的实现

如何使用 Google Python Client for Cloud Functions 获取 Google Cloud Functions 列表?

Cloud Functions for Firebase 超时

Cloud Functions for Firebase onWrite 超时

在 Cloud Functions for Firebase 中访问 db 数据

Cloud Functions for Firebase 组织