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.4
和 firebase-functions
0.5.4
仍然存在问题
感谢您的验证。显然修复是不够的。我们可以在另一个版本中解决它。您可以同时使用上面的代码解决它。
云函数的下一个后端更新应该为所有可能的返回类型修复此问题(而不是超时云函数将记录警告并完成)。以上是关于Cloud Functions for Firebase onWrite 超时的主要内容,如果未能解决你的问题,请参考以下文章