11

私は、トランザクションを終了するまで待つべきトランザクションの約束を返します。トランザクションは正常に実行されますが、約束は決して解決されないようです。FireWall onWriteタイムアウトのクラウド機能

この機能は、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; 
}); 

EDIT:

私は何.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

何らかの理由で、 'then'を呼び出すと動作します。例: 'countRef.transaction(current => {..})。then(()=> {console.log(" Transaction finished ")})' – Christian

答えて

4

既知のがありましたfirebaseデータベースの参照とスナップショットがJSONシリアル化できないため、クラウド機能の戻り値として使用できない古いバージョンのfirebase-admin SDKで問題が発生しました。これにはスナップショットも含まれているため、トランザクションの戻り値も含まれます。

あなたのハックはバグを回避します。 firebase-adminのバージョンを更新した場合にも修正が必要です。

+0

OK、最新の 'firebase-admin'にアップデートしようとします。 '4.1.4'、私はバージョン' 4.1.3'を使用しています。 –

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

関連する問題