Firebase云函数onWrite超时问题

11

我返回一笔交易承诺,它应该在停止函数之前等待交易完成。交易执行得很好,但这个承诺似乎永远不会解决。

我在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”解决了这个问题,我自己创建了一个 Promise,因为无论.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));
});

1
看起来是 firebase 库本身的问题。 - Michał Pietraszko
这个“hack”显著降低了我的云函数的执行时间。 - Michał Pietraszko
4
由于某些原因,如果您调用then,它会起作用。例如 countRef.transaction(current => { .. }).then(() => { console.log("Transaction finished") }) - Christian
1个回答

4

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

您的hack可以解决这个bug;如果更新firebase-admin的版本,您还应该获得修复。


好的,我会尝试将firebase-admin更新到最新版本 4.1.4,顺便提一下,我目前用的是4.1.3版本。 - Alex Peterson
1
我在最新版本4.1.4中遇到了相同的问题。我正在按照提供的示例进行操作:https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js - dardub
我可以确认,firebase-admin 4.1.4firebase-functions 0.5.4 仍然存在问题。 - Michał Pietraszko
4
感谢您的确认。显然修复不够完善。我们可以在另一个版本中解决这个问题。与此同时,您可以使用上面的代码来解决问题。 - Thomas Bouldin
1
Cloud Functions 的下一个后端更新应该会修复所有可能的返回类型(而不是超时,云函数将记录警告并完成)。 - Thomas Bouldin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接