11

我在返回停止函数之前应等待事务完成的事务许诺。交易执行得很好,但承诺似乎永远不会解决。用于Firebase onWrite超时的云端函数

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

编辑:

我解决这个问题,下面的“黑客”,我创建了一个承诺自己,因为无论.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'库本身的问题。 –

+0

这个“黑客”显着降低了我的云功能的执行时间。 –

+3

出于某种原因,如果你打电话'然后'它的作品。示例'countRef.transaction(current => {..})。然后(()=> {console.log(“Transaction finished”)})' – Christian

回答

4

有一个已知问题与Firebase-admin SDK的旧版本有关,因为Firebase数据库引用和快照无法被JSON序列化,因此无法用于Cloud Functions的返回值。这包括事务返回值,因为它们也具有快照。

你的破解工作可以解决这个问题;如果你更新了你的firebase-admin版本,你也应该得到修复。

+0

OK,将尝试更新到最新的'firebase-admin' '4.1.4',我正在使用'4.1.3'版本BTW –

+1

我与最新版本4.1.4有同样的问题。我正在按照提供的示例进行操作:https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js – dardub

+0

我可以证实它仍然是'firebase-admin'的问题' 4.1.4'和'firebase-functions'' 0.5.4' –

相关问题