有了一个用户可以在其中对其他用户图片进行评分的应用程序,我希望统计一个用户已收到的总投票数。我发现用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
},
...
]
最佳答案
不,您应该使用transaction递增值。您也没有返回值,因此您的函数将超时。在Cloud Functions中返回是必要的。
您的代码应如下所示:
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
}
})
})
但是,我无法测试代码,但是我认为它应该可以工作。请注意,当用户将值添加到给定路径时,该值将增加,而当用户在给定路径中删除时,该值将减少。可以像我在示例中所说的那样轻松更改。
关于javascript - Firebase Cloud Functions-使用onWrite事件更新值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45632876/