Ich habe ein sehr einfaches Abfrageskript geschrieben, das Stimmen in eine Firebase-Datenbank speichert. Um mehrere Abstimmungen durch denselben Benutzer zu verhindern, speichere ich E-Mails an ein separates Objekt und überprüfe danach, bevor ein neuer Eintrag platziert werden kann (dieses Ding ist für meine eigenen Informationen und muss keine hohe Sicherheit sein).gibt es einen Weg in Firebase, um Schreibvorgänge in schneller Folge zu verhindern?
Bis jetzt scheint es zu verhindern, dass grundlegende Foul Play, aber ich bekomme viele Instanzen von mehreren Stimmen in schneller Folge (wahrscheinlich schneller, als der Browser neu laden könnte). Im schlimmsten Fall gab es 16 Stimmen in Millisekunden.
Gibt es eine Möglichkeit, diese schnellen Nachfolge-Schreibvorgänge in Firebase oder auf der JavaScript-Seite zu verhindern?
Firebase Daten:
{
"votes" : {
" obj1 " : {
"-KHXPWtcxzXhs2ULBE1Q" : {
"name" : " name1 ",
"email" : "email1",
"timestamp" : 1463013744297
},
"-KHXPWuyhTg6S3Qcw4e9" : {
"name" : " name1 ",
"email" : "email1",
"timestamp" : 1463013744382
}
},
"obj2" : {
"-KHZ20CRiT5fs6H4Nhel" : {
"name" : "name2",
"email" : "email2",
"timestamp" : 1463041135613
}
},
},
"email" : {
"-KHXPWtHSNYWBmvXsmNx" : {
"email" : "email1",
"timestamp" : 1463013744292
},
"-KHXPWus4hSwi1t00Gq_" : {
"email" : "email1",
"timestamp" : 1463013744377
},
"-KHZ20CdfcsoGjvn98Q" : {
"email" : "email2",
"timestamp" : 1463041135606
},
}
}
Die jQuery:
var validateEmail = /^[A-Z0-9._%+-][email protected]([A-Z0-9-]+\.)+[A-Z]{2,4}$/i;
function castVote() {
var ref = new Firebase('firebaseurl');
$(".notification.exists").hide();
$(".notification.valid").hide();
var obj = $('#obj').val().toLowerCase();
var email = $('#email').val().toLowerCase();
var emailref = ref.child("email");
if (validateEmail.test(email)){
emailref.once('value', function(snapshot) {
var exists = false;
snapshot.forEach(function(childSnapshot){
if(email === childSnapshot.val().email){
exists = true;
}
})
if (exists){
$(".notification.exists").show();
}
else{
write(obj,email,ref,emailref);
}
});
}
else{
$(".notification.valid").show();
}
}
function write(obj,email,ref,emailref){
var objref = ref.child("obj/" + obj);
//save email
emailref.push().set({
email:email,
"timestamp": Firebase.ServerValue.TIMESTAMP
});
//save vote
objref.push().set({
obj: obj,
"email": email,
"timestamp": Firebase.ServerValue.TIMESTAMP
});
//clear fields
$('#obj').val('');
$('#email').val('');
}
}
Wenn Sie 'write' aufrufen, prüfen Sie ein Cooldown-Flag und' return', falls true, setzen Sie das Cooldown-Flag, 'setTimeout', um es zu deaktivieren. – SparK