2017-08-11 41 views
1

擁有一個用戶可以對其他用戶圖片進行評分的應用程序,我希望計算出用戶收到的總投票數。我發現用Firebase實現這一目標的最佳方式是控制'onWrite'事件並在收到投票時爲每個用戶手動更新計數器。Firebase雲端功能 - 使用onWrite事件更新值

我用下面的代碼發現的問題是'votesCount'沒有在第一個'onWrite'事件上更新,但是它在下一個'onWrite'事件中更新,並且以前用戶的速度。這是爲什麼發生?這是一個投票應用程序的好方法嗎?

以下方法的目的是檢查投票用戶是否有'votes_count',如果爲true,則將新值添加到舊值,在相反的情況下只需添加新值。

exports.updateVotesCount = functions.database.ref('/votes/{id}').onWrite(event => { 
    const data = event.data.val(); 
    var votesCount = admin.database().ref('/profiles/' + data.to).child('votes_count'); 
    votesCount.once('value').then(function(snapshot) { 
     if (snapshot.val()) { 
     votesCount.set(snapshot.val() + data.rate); 
     } else { 
     votesCount.set(data.rate); 
     } 
    }); 
}); 

這是我使用的數據結構方面:

{ 
    profiles: [ 
     userId: { 
     name: "...", 
     image: "...", 
     votes_count: "..." 
     }, 
     ... 
    ], 
    votes: [ 
     voteId: { 
     from: "userId", 
     to: "userId", 
     rate: n 
     }, 
     ... 
    ] 

回答

1

不,你應該使用transaction遞增值。你也沒有返回一個值,所以你的函數會超時。返回在雲端函數中是必需的。

您的代碼應該是這樣的:

exports.updateVotesCount = functions.database.ref('/votes/{id}').onWrite(event => { 
    const data = event.data.val(); 
    return admin.database().ref('/profiles/' + data.to).child('votes_count').transaction(function(votes) { 
    if (event.data.exists()){ //If there is a onCreate action (user adds a vote) or use your own snapshot.val() 
      return (votes || 0) + 1; //providing a default "0" value if there is no value 
     }else{ // if there is a onDelete action (user removes avote) 
      return (votes || 1) - 1; //providing a default "1" value if there is no value 
    } 
    }) 
}) 

我然而,不是測試代碼,但我認爲它應該工作...請注意,當用戶添加一個值到給定的值將遞增路徑,當用戶在給定的路徑上移除時,該值將遞減,但您可以像我在示例中所說的那樣輕鬆地更改這個值。

+0

非常感謝,這似乎是一大步,現在我可以使用事務正確更新它,唯一的一點是該函數正在打印「錯誤序列化返回值:TypeError:將圓形結構轉換爲JSON」安慰。我不知道爲什麼自「票」應始終是一個浮動值。 –

+1

@AlejandroMoránO男孩,如果你能解決這個錯誤,你是我的英雄。我在Github上提問:https://github.com/firebase/functions-samples/issues/193,並且有一種解決方法......我認爲這是Firebase中的一個錯誤,應該儘快解決。 –

+0

是的,它似乎是根據這個答案的Firebase錯誤:https://github.com/firebase/functions-samples/issues/193#issuecomment-317884437返回值是一個TransactionResult並且不能被序列化,這是一個解決方法。 –

相關問題