Почему мои данные дважды сохраняются в базе данных Firebase? - PullRequest
0 голосов
/ 11 июля 2020

Я новичок в использовании Firebase, поэтому все советы приветствую.

Чего я пытаюсь достичь?

Я хочу создать проигрыватель, только если пользователь не превысил размер своей команды ("numberOfplayersLimit"). Итак, в настоящее время я использую транзакцию firebase, которая сначала проверяет, не превысила ли команда свой лимит «numberOfPlayers», если команда не превысила свой лимит, увеличиваю счетчик «numberOfplayersLimit» и затем добавляю игрока в базу данных, как показано ниже.

В чем моя проблема

В настоящее время я использую .push() для добавления игроков, однако он создает игрока дважды, как показано ниже, поскольку вы можете видеть полное имя то же самое в других записях, но у них разные uid.

Ниже приведен снимок экрана из моей базы данных Firebase в реальном времени JSON структура

enter image description here

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;

        }
    });

1 Ответ

0 голосов
/ 12 июля 2020

Вызов teamplayersref.push(playerData) в вашем обработчике транзакции не является частью самой транзакции. Таким образом, если транзакция повторяется, вы в конечном итоге вызываете teamplayersref.push(playerData) несколько раз, создавая дочерний узел для каждой попытки.

Чтобы сгенерировать новый дочерний элемент с уникальным идентификатором pu sh, используйте pu sh без аргумент, чтобы получить новый ключ, а затем использовать его в значении return вашей транзакции. Это означает, что ваша транзакция должна будет выполняться на всем узле firebase.database().ref('/teams'), поскольку вы изменяете и счетчик, и игроков.

const teamRef = firebase.database().ref('/teams').child(myUserId);

teamRef.transaction(function(team){
    team = team || { numberOfplayersLimit: 0, players: {} };
    if (team.numberOfplayersLimit == 11) {
        console.error('You have exceed your team size limit, Delete a player from your team or contact us to upgrade your package');
    }
    else  {
        team.numberOfplayersLimit = team.numberOfplayersLimit + 1;
        const newPlayerKey = teamRef.push().key; // this line does not write to the database

        team.players[newPlayerKey] = playerData;

        return team;
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...