javascript - Firebase-transaktion returnerar null och slutförs utan fel


Jag har en enkel transaktion som ska returnera antalet av en barnnod som är lagrad i min realtidsdatabas och öka det. Det kan vara värt att notera att denna transaktion är inuti en Firebase-moln onWrite-funktion.

Problemet är att de returnerade uppgifterna är null. Jag vet att detta är möjligt när klientdata är föråldrad, men funktionen avslutas utan fel och committed är falskt.

När jag använder exakt samma referens för att hämta en datasnabbbild returneras det korrekta värdet.

var ref = admin.database(devDB).ref('/path/to/countValue');
ref.transaction(function(count) {
  if(count != null) {
     var newCount = count + 1;
     return newCount;
  }
 }, function(error, committed, ss) {
     if(error) {
        console.log('error: ', error);
     }
     console.log('committed: ', committed);
});

Svar #1

Du kan förvänta dig att den första anropet av en transaktionshanterare kommer att ge dig ett null-värde. Detta anges i dokumentationen:

Transaktionsfunktionen anropas flera gånger

Din transaktionshanterare anropas flera gånger och måste kunna hantera null-data. Även om det finns befintlig data i din databas kan den vara inte lokalt cachad när transaktionsfunktionen körs.

Problemet är att din funktion inte returnerar ett värde i fallet där värdet är null. Detta signalerar till transaktionen att du vill avbryta transaktionen. Enligt API-dokumentationen för transaction():

Funktionen bör returnera det nya värdet som den vill skriva (som ett JavaScript-objekt). Om undefined returneras (dvs. om du returnerar utan argument) kommer transaktionen att avbrytas och datan på denna plats kommer inte att ändras.

Exempelkoden i dokumentationen jag länkade till tidigare som utför en inkrementering returnerar alltid ett värde:

upvotesRef.transaction(function (current_value) {
  return (current_value || 0) + 1;
});