Firebase Cloud Functions - 使用 onWrite 事件更新值
Firebase Cloud Functions - Update a value using onWrite event
有一个用户可以在其中对另一个用户的图片进行评分的应用程序,我想计算一个用户收到的总票数。我发现使用 Firebase 实现此目标的最佳方法是控制 'onWrite' 事件并在每个用户收到投票时手动更新计数器。
我发现以下代码的问题是 'votesCount' 没有在第一个 'onWrite' 事件中准确更新,但在下一个 'onWrite' 事件中更新与以前用户的费率。为什么会这样?这是投票应用程序的好方法吗?
下面方法的目的是检查被投票的用户是否有'votes_count',如果为真,则将新值添加到旧值,否则只添加新值。
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 来增加值。您也没有 return 值,因此您的函数会超时。返回在 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
}
})
})
但是我无法测试代码,但我认为它应该可以工作...请注意,当用户将值添加到给定路径时,该值会增加,而当用户在给定路径,但您可以像我在示例中所说的那样轻松更改它。
有一个用户可以在其中对另一个用户的图片进行评分的应用程序,我想计算一个用户收到的总票数。我发现使用 Firebase 实现此目标的最佳方法是控制 'onWrite' 事件并在每个用户收到投票时手动更新计数器。
我发现以下代码的问题是 'votesCount' 没有在第一个 'onWrite' 事件中准确更新,但在下一个 'onWrite' 事件中更新与以前用户的费率。为什么会这样?这是投票应用程序的好方法吗?
下面方法的目的是检查被投票的用户是否有'votes_count',如果为真,则将新值添加到旧值,否则只添加新值。
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 来增加值。您也没有 return 值,因此您的函数会超时。返回在 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
}
})
})
但是我无法测试代码,但我认为它应该可以工作...请注意,当用户将值添加到给定路径时,该值会增加,而当用户在给定路径,但您可以像我在示例中所说的那样轻松更改它。