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' –

相關問題