我有一个小应用程序,用户可以根据他们最近在各种运动中的表现来投票或者投票。
当点击upvote按钮时,选民的UID(通过Google登录)应该被推送到投票的相应玩家的数据库中。像这样:
以下是执行Firebase工作的代码。我认为这是其中一条我错了。
this.database.child(playerId).transaction
或
ref = firebase.database()。ref('球员/选民');
代码:
this.database = firebase.database().ref().child('players');
upvotePlayer(playerId) {
this.state.user ?
this.database.child(playerId).transaction(function (player) {
if (player) {
console.log("UID: " + uid)
var ref = firebase.database().ref('players/voters');
ref.child(uid).set(1);
}
return player;
})
:
console.log("Must be logged in to vote.")
}
答案 0 :(得分:1)
问题在于:
var ref = firebase.database().ref('players/voters');
它正在voters
节点下添加players
,而不是push id
节点下。
所以你必须从数据库中检索pushid,然后执行以下操作:
var ref=firebase.database().ref().child('players').child(playerId).child('voters');
因此,选民将成为pushid
孩子中的一员。
对于未来观众:
最好在以下情况下使用交易:
如果多个用户同时支持同一个帖子或客户端有陈旧数据,则使用事务可防止upvote计数不正确
答案 1 :(得分:1)
您将投票存储在此路径players/voters
中,而它应位于此路径中players/$playerId/voters
结帐
this.database = firebase.database().ref().child('players');
upvotePlayer(playerId) {
this.state.user ?
this.database.child(playerId).transaction(function (player) {
if (player) {
console.log("UID: " + uid)
var ref = firebase.database().ref('players/' + playerId + '/voters');
ref.child(uid).set(1);
}
return player;
})
:
console.log("Must be logged in to vote.")
}
transaction
方法有transactionUpdate
函数作为参数,应该返回新值并且你没有返回任何,我认为更好的解决方案是不使用事务
upvotePlayer(playerId)
{
if(this.state.user)
{
let ref = firebase.database().ref('players/' + playerId + '/voters');
ref.child(uid).set(1);
}
else
{
console.log("Must be logged in to vote.")
}
}
答案 2 :(得分:0)
实际上,您正在将该值推送到具有玩家ID的付款人节点。您已将数据推送到玩家身份voters
的子节点。试试这个代码: -
this.database = firebase.database().ref().child('players');
upvotePlayer(playerId) {
this.state.user ?
this.database.child(playerId).transaction(function (player) {
if (player) {
console.log("UID: " + uid)
player.ref.child(voters).push(uid);
}
return player;
})
console.log("Must be logged in to vote.")
}
问题是你实际上是在players
节点的引用并在名为voters
的同一级别的playerid上创建新节点。下面的行只需在与voters
相同的级别创建一个新节点playerid
。
var ref = firebase.database().ref('players/voters');
ref.child(uid).set(1);
如您所见,voters
根节点中没有名为players
的节点。但是您设置的值是使用set()
函数