0

サイズカウントするように、私はcount increase/decreaseを達成しようとしています:Firebaseクラウド機能は、子どもたちが<a href="https://firebase.google.com/docs/reference/functions/functions.database.DeltaSnapshot#val" rel="nofollow noreferrer">firebase cloud functions API reference</a>後

Uploads/ 
    - Posts/ 
      - post_1 
      - post_2 
      ... 

    - Likes/ 
      - post_1/ 
       - Number: 4 
      - post_2/ 
       - Number: 2 
      ... 

そして、場所以外

exports.LikeCount= functions.database.ref('/Posts/{postID}').onWrite(event => { 
    const Ref  = event.data.ref; 
    const postID = event.params.postID; 
    const likeCount= Ref.parent.parent.child('/Likes/' + postID + '/Number');   

    return likeCount.transaction(current => {   
     if (event.data.exists() && !event.data.previous.exists()) { 
      return (current || 0) + 1; 

     }else if (!event.data.exists() && event.data.previous.exists()) { 
      return (current || 0) - 1; 

     } 

    }).then(() => { 
     console.log("Done");   
    }); 
}); 

を、それが与えられた例と同じです。

another exampleまた、好き嫌いの数が削除されると、好き嫌い(子供)の数が再計算されます。

ここに私のバージョン(または少なくともそれのアイデア)があり、好きな数をチェックし、1より小さい場合は再計算します。 (あなたの好きな数が存在しない場合、存在する数に関係なく、最初の関数が1を与えるからです)。第二の機能で

exports.reCount= functions.database.ref('/Likes/{postID}/Number').onUpdate(event => { 
    const value = event.data.val; 

    //If the value is less than 1: 
    if (value <= 1) { 
     const currentRef = event.data.ref; 
     const postID  = event.params.postID;    
     const postRef = currentRef.parent.parent.child('/Uploads/Posts/{postID}/');    

     return postRef.once('value') 
      .then(likeData=> currentRef.set(likeData.numChildren()));    
    } 
}); 

、私は文字列値を取得するだろうと思ったFBログに[Function: val]を与え、次の場所event.data.valを使用してNumber値を取得しようとしました。

...およびcurrentRef.parent.parent.child('/Uploads/Posts/{postID}/').numChilren();は、TypeError: collectionRef.numChildren is not a functionです。

オンラインチュートリアルやAPIリファレンスを読みましたが、なぜ文字列値を取得できないのか混乱しています。

私は私が働くことができるいくつかの例を探していますね。

+0

[Firebaseのためのクラウドファンクション:インクリメントカウンタ](0120-184-3112) –

+0

私はこれを読んだ。私が尋ねた質問は実際にリンクでは答えられていません。 –

+0

"期待どおりに動かない"以外の観察はありますか? –

答えて

5

ここでうまくいかないことがたくさんあります。

ログから見ると、event.data.valは機能です。 event.data.val()

第二の事:あなたが既に知っているとき、なぜあなたが照会する場所の絶対パスをcurrentRef.parent.parent.childを使用しているかわからないが、あなたは変わった場所からJavaScriptオブジェクトを取得するためにval()を呼び出す必要があります。 /Uploads/Posts/{postID}/:あなたはこの文字列を構築するために、変数補間を使用しようとする試みのように見えるもので、単一引用符を使用している、

currentRef.root.ref(`/Uploads/Posts/${postID}/`) 

第三の事:あなたは直接そこに着くことができます。このためにバッククイックを使用し、そこに$ {}を使用して変数を挿入する必要があります(あなたは$を省略しています)。

最後に、同じ場所を変更しようとして2つの関数が同時に実行される可能性があるため、他のサンプルコードのように、トランザクションを使用して書き込みを実行する必要があります。私はwoudldn'tはそれを残して助言する。

+0

ダグありがとうございます。これらのフィードバックは助けになりました。とても有難い! –

関連する問題