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
},
...
]
非常感谢,这似乎是一大步,现在我可以使用事务正确更新它,唯一的一点是该函数正在打印“错误序列化返回值:TypeError:将圆形结构转换为JSON”安慰。我不知道为什么自“票”应始终是一个浮动值。 –
@AlejandroMoránO男孩,如果你能解决这个错误,你是我的英雄。我在Github上提问:https://github.com/firebase/functions-samples/issues/193,并且有一种解决方法......我认为这是Firebase中的一个错误,应该尽快解决。 –
是的,它似乎是根据这个答案的Firebase错误:https://github.com/firebase/functions-samples/issues/193#issuecomment-317884437返回值是一个TransactionResult并且不能被序列化,这是一个解决方法。 –