2017-04-04 2 views
0

Betrachten Sie den folgenden (vereinfachte) Code: (. Ein serverseitige Arbeiter die Aufgabe verarbeitet, schreibt das Ergebnis an einem anderen Ort auf der Datenbank, löscht dann das Objekt)Was könnte verhindern, dass ein "Kind entferntes" Ereignis ausgelöst wird?

var queueTask = function (taskObject) { 
    var deferred = $q.defer(); 

    // Create new task reference & push new Task object to reference location 
    var newTaskRef = firebase.database().ref("task").push(taskObject); 

    newTaskRef.once('child_removed', function (snapshot) { 
     // SUCCESS 
     console.log("@DEBUG - TASK COMPLETE/CHILD REMOVED"); 
     deferred.resolve(snapshot); 
    }); 

    return deferred.promise; 
}; 

Das Objekt Aufgabe wird gelöscht, aber das Ereignis child-removed wird nie ausgelöst.

Was könnte ein child-removed Ereignis von feuern verhindern?

+0

Meine erste Annahme ist, dass die Aufgabe zu schnell ausgeführt wird. – Lindauson

+0

Ich habe die Verarbeitungszeit als einen Faktor beseitigt: Ich fügte dem Verarbeitungscode des Task-Worker eine künstliche Verzögerung hinzu, das Ergebnis ist jedoch das gleiche: Das On-Removed-Ereignis wird nie ausgelöst. – Lindauson

+0

Ich habe auch eine Aufgabe zu einem Nicht-Root-Speicherort ('.../queue/task /') hinzugefügt, aber das hat das Problem auch nicht gelöst. – Lindauson

Antwort

0

überprüfen Sie die Sicherheitsregeln:

Wenn Ihre Sicherheitsregeln auf dem folgenden Standardwert beibehalten werden, Ereignisabfragen werden nicht funktionieren:

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null", 
    } 
} 

Auch wenn Ihre Sicherheitsregeln nicht zulassen, Read- Zugriff auf den Speicherort, in den die Daten geschrieben wurden (dh Benutzer hat Schreibzugriff, aber keinen Lesezugriff) Ereignisabfragen schlagen fehl.

Ereignisabfragen geben eine Momentaufnahme der geänderten Daten zurück (gelöschte Daten im Fall des Ereignisses child_removed), so dass Lesezugriff erforderlich ist.

Verwandte Themen