1

Ich habe die Wolke Funktion wie so:Feuerbasis Cloud-Funktion Transaktion arbeitet sporadisch

exports.updateNewsCount = functions.database.ref('/channels/{channelId}/news/{newsId}/') 
.onWrite (event => { 
    const channelId = event.params.channelId; 
    const newsId = event.params.newsId; 
    let CntRef = admin.database().ref('/channelDetails/' + channelId + '/newsCnt'); 
    if (event.data.exists() && !event.data.previous.exists()){ 
     return CntRef.transaction(function(current){ 
      if (current){ 
       console.log ('current is not null'); 
       return (current || 0) + 1; 
      } 
      else { 
       console.log('current is null'); 
       return current; 
      } 
     },function(error, b, d){ 
      if (error) 
       console.log(error); 
      else 
       console.log ('error is null'); 
      if (b) 
       console.log('boolean is true'); 
      else 
       console.log('boolean is false'); 

      if (d) 
       console.log('snapshot is ' + d); 
      else 
       console.log ('snapshot is null'); 
     }).then(()=>{}); 
    } else if (!event.data.exists() && event.data.previous.exists()){ 
     return CntRef.transaction(function(current){ 
      if (current) 
       return (current || 1) - 1; 
      else 
       return current; 
     }, function(error, b, d){if (error) console.log(error); if (d) console.log(d);}).then(()=>{}); 
    } 
}); 

Sie feuert konsequent, wie ich die Log-Einträge sehen können. Das newsCnt-Feld wird jedoch nicht wie erwartet aktualisiert. Manchmal wird es aktualisiert und manchmal nicht !!! Was mache ich hier falsch?

+0

Haben Sie versucht, sich an den verschiedenen Punkten anzumelden, von denen Sie erwarten, dass die Transaktion ausgeführt wird, um zu sehen, was sie eigentlich macht? –

+0

Ja. Ich habe console.log an mehreren Stellen hinzugefügt, und wenn es funktioniert, sind die Protokolle wie erwartet. Die Cloud-Funktion kehrt auch immer mit dem Status ok zurück. Also ich weiß, dass es keine Syntaxfehler gibt. –

+0

Die Cloud-Funktion wird jedes Mal korrekt ausgelöst, wenn sie benötigt wird. Die Funktion kehrt gemäß dem Protokoll mit dem Status ok zurück. Wenn es funktioniert, (meine console.logs, die ich im obigen Code entfernt habe) sagen mir, dass die Transaktion zweimal probiert wurde, einmal wo aktuell null war und ein zweites Mal, wenn der aktuelle Wert nicht null war. Ich habe das Gefühl, dass es vielleicht noch andere Cloud-Funktionen gibt, die das verhindern oder ähnliches. –

Antwort

1

Sie sollten erwarten, dass eine Transaktion möglicherweise mehrere Male aufgerufen wird, das erste Mal mit null. So arbeiten Transaktionen. Bitte lesen Sie die Dokumentation here.

Insbesondere Folgendes zu beachten callout in diesem Abschnitt:

Hinweis: Da Ihre Update-Funktion mehrmals aufgerufen wird, muss es der Lage sein, die Null-Daten zu handhaben. Selbst wenn in Ihrer entfernten Datenbank Daten vorhanden sind, wird sie möglicherweise nicht lokal zwischengespeichert, wenn die Transaktion ausgeführt wird, was zu Null für den Anfangswert führt.

+0

Ja, das habe ich verstanden. Und ich denke, dass ich mich auch in meinem Code darum gekümmert habe. Ich gebe Strom zurück, wenn Strom null ist. –

+0

Wenn Sie eine Funktion für den onComplete-Parameter für die Transaktion bereitstellen und ihre Parameter protokollieren, was finden Sie? Transaktionen sind definitiv nicht kaputt. https://firebase.google.com/docs/reference/admin/node/admin.database.Reference#transaction –

+0

Ich habe den Code geändert, um onComplete und console.log's einzuschließen. Mein Protokoll zeigt, dass _current null_ (zweimal) ist, _boolean ist true_ (einmal), _snapshot ist [object Object] _ (einmal) und _Function Ausführung dauerte 1297 ms, beendet mit Status: 'ok'_ (einmal). @Doug –

Verwandte Themen