2017-06-30 11 views
2

Überprüfen Sie meine Cloud-Funktionen unten. Ich möchte einige Dinge tun, wenn sich nur das Statusfeld in Job/{jobId} ändert und dann einige andere Dinge, wenn sich andere Felder in Job/{jobId} ändern, also habe ich beide Funktionen unten erstellt. Aber es scheint, dass beide Funktionen ausgelöst werden, wenn sich das Statusfeld ändert. Wie kann ich dieses Verhalten einschränken?Ich muss erkennen, wenn nur ein bestimmtes Feld in meiner Cloud-Funktion geändert hat

const functions = require('firebase-functions'); 
const admin = require('firebase-admin'); 
admin.initializeApp(functions.config().firebase); 

//----- 
const db = functions.database; 
const adminDb = admin.database(); 
//----- 


//JOBS 
exports.onJob = db 
    .ref("/Jobs/{jobId}") 
    .onWrite((event) => { 

     //...my codes 

    }); 



exports.onJobStatus = db 
    .ref("/Jobs/{jobId}/status") 
    .onWrite((event) => { 

    //...my codes 

    }); 

Antwort

0

Sie können den vorherigen Zustand (event.data.previous) Ihres Knotens mit dem aktuellen Status (event.data) vergleichen.

So können Sie prüfen, ob nur das Statusfeld geändert wurde und dann einen Code auslösen.

Nehmen wir zum Beispiel an, Sie haben auch "name" und "jobDate" Felder in Ihrem Knoten. Die bedingte Anweisung am beggining Ihrer Funktion könnte wie folgt aussehen:

let statusHasChanged = false; 
let otherFieldsHaveChanged = false; 

if (event.data.previous.val().status !== event.data.val().status) { 
    //status has changed 
    statusHasChanged = true; 
} 

//check other fields 
    if ((event.data.previous.val().name !== event.data.val().name) 
    || (event.data.previous.val().jobDate !== event.data.val().jobDate) { 
    //at least one other field has changed 
    otherFieldsHaveChanged = true; 
} 

//now I know exactly what has changed and what to do next !!! 

Und dann können Sie die Ergebnisse verwenden Code, den Sie ausführen möchten.

Sie könnten auch .changed() Funktion verwenden, um zu überprüfen, ob Feld geändert hat (wenn Sie nicht wissen, was sich geändert hat) finden Sie in der docs

Das obige Beispiel mit geändert() Funktion aussehen könnte wie folgt:

let eventSnapshot = event.data; 
let statusSnapshot = eventSnapshot.child('status'); 
let nameSnapshot = eventSnapshot.child('name'); 
let jobDateSnapshot = eventSnapshot.child('jobName'); 

let statusHasChanged = false; 
let otherFieldsHaveChanged = false; 

if (statusSnapshot.changed()) { 
    //status has changed 
    statusHasChanged = true; 
} 

//check other fields 
    if (nameSnapshot.changed() || jobDateSnapshot.changed()) { 
    //at least one other field has changed 
    otherFieldsHaveChanged = true; 
} 
+0

wow ... Ich liebe die Erklärung in den Dokumenten ... Wenn Sie Ihre Antwort re-editieren könnten, um die Erklärung im Dokument zu implementieren, denke ich, dass es das gut beantworten wird. Danke vielmals. –

+0

Neu bearbeitet, ich hoffe jetzt ist es klar :) –

0

Alle Änderungen am Statusknoten, zählen als Änderungen am Jobid-Knoten. Anstatt also parent (jobid) zu hören, könnten Sie Listener für jedes Kind erstellen, an dem Sie interessiert sind. Oder Sie könnten eine Bedingung in Ihrem Jobid-Listener hinzufügen, die Ereignisse ignoriert, die vom Statusknoten stammen.

+0

können Sie diese Änderung mit einem Codebeispiel veranschaulichen. –

Verwandte Themen