Saya baru menggunakan Firebase jadi semua saran diterima.

Apa yang ingin saya capai?

Saya ingin membuat pemain hanya jika pengguna belum melebihi ukuran tim mereka ("numberOfplayersLimit"). Jadi saat ini saya menggunakan transaksi firebase yang pertama-tama memeriksa bahwa tim belum melampaui batas "numberOfPlayers", jika tim belum melampaui batas mereka, tambahkan penghitung "numberOfplayersLimit" dan kemudian tambahkan pemain ke database seperti yang ditunjukkan di bawah ini.

Apa masalah saya

Saat ini saya menggunakan .push() untuk menambahkan pemain namun itu membuat pemain dua kali seperti yang ditunjukkan di bawah ini karena Anda dapat melihat nama lengkapnya sama di catatan lain tetapi mereka memiliki uid yang berbeda.

Di bawah ini adalah tangkapan layar dari struktur JSON basis data real-time Firebase saya

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;

        }
    });

0
Jim 11 Juli 2020, 23:35

1 menjawab

Jawaban Terbaik

Panggilan teamplayersref.push(playerData) di pengendali transaksi Anda bukan bagian dari transaksi itu sendiri. Jadi jika transaksi dicoba ulang, Anda akhirnya memanggil teamplayersref.push(playerData) beberapa kali, membuat simpul anak untuk setiap percobaan.

Untuk membuat turunan baru dengan ID push unik, gunakan push tanpa argumen untuk mendapatkan kunci baru, lalu gunakan itu dalam nilai return transaksi Anda. Ini berarti bahwa transaksi Anda harus berjalan di seluruh simpul firebase.database().ref('/teams'), karena Anda memodifikasi penghitung dan pemain.

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;
    }
});
0
Frank van Puffelen 13 Juli 2020, 01:15