【发布时间】:2020-07-11 20:35:56
【问题描述】:
我是使用 Firebase 的新手,因此欢迎所有建议。
我想要达到什么目的?
我只想在用户没有超过他们的团队规模(“numberOfplayersLimit”)的情况下创建一个玩家。 所以目前我正在使用一个firebase事务,它首先检查团队没有超过他们的限制“numberOfPlayers”,如果团队没有超过他们的限制,增加“numberOfplayersLimit”计数器,然后将玩家添加到数据库中,如下所示。
我的问题是什么
我目前正在使用.push() 添加播放器,但是它创建了两次播放器,如下所示,因为您可以看到其他记录中的全名相同,但它们具有不同的 uid。
下面是我的 Firebase 实时数据库 JSON 结构的截图
var myUserId = firebase.auth().currentUser.uid;
const playerData = {
fullName:this.state.fullName,
};
//This is where the players are stored
const teamplayersref = firebase.database().ref('/teams').child(myUserId).child('/players')
//Transaction - Team reference path for the TeamPlayers Limit
const getTeamPlayersLimit = firebase.database().ref('/teams').child(myUserId).child('numberOfplayersLimit');
getTeamPlayersLimit.transaction(function(numberOfplayersLimit){
if (numberOfplayersLimit == 11) {
alert('You have exceed your team size limit, Delete a player from your team or contact us to upgrade your package');
}
else
{
//increment teamplayers limit
numberOfplayersLimit = numberOfplayersLimit + 1;
teamplayersref.push(playerData);
return numberOfplayersLimit;
}
});
【问题讨论】:
-
在事务处理程序中放置一个 alert() 不是一个好主意。相反,您应该使事务失败,并在完成后发出警报。还要记住,事务处理程序可能会被调用多次(以 null 作为数据库中的值开始),并且通常应该只修改事务所在位置的数据。我建议添加一些日志以查看实际发生的情况。
-
您不应检查
numberOfplayersLimit == 11,而应检查numberOfplayersLimit >= 11。这包括 11 及以上的任何东西。第一个确实只包含 11。 -
@DougStevenson 递增不是问题,因为它增加了一个,这是正确的。问题是当我使用 .push() 时,它会创建两次播放器。您建议记录什么?
-
@Simon 感谢您的帮助,但我现在已经在那里尝试过了,我的问题仍然存在
-
在事务句柄中记录任何内容以查看它是如何执行的。使用调试来跟踪其执行。 push() 被调用了两次,我的第一条评论是给你原因 - 处理程序被调用了两次。
标签: javascript firebase react-native firebase-realtime-database