12

Ich habe eine Cloud-Funktion verwendet, um Querverweise auf zwei Listen und finden Sie Werte, die über die Listen miteinander übereinstimmen. Die Funktion scheint ordnungsgemäß zu funktionieren, aber in den Protokollen sehe ich immer diese Error serializing return value: TypeError: Converting circular structure to JSON. Hier ist die Funktion ...Cloud-Funktionen für Firebase - Fehler Serialisierung Rückgabewert:

exports.crossReferenceContacts = functions.database.ref('/cross-ref-contacts/{userId}').onWrite(event => { 

    if (event.data.previous.exists()) { 
     return null; 
    } 

    const userContacts = event.data.val(); 
    const completionRef = event.data.adminRef.root.child('completed-cross-ref').child(userId); 
    const removalRef = event.data.ref; 

    var contactsVerifiedOnDatabase ={}; 
    var matchedContacts= {}; 


    var verifiedNumsRef = event.data.adminRef.root.child('verified-phone-numbers'); 
    return verifiedNumsRef.once('value', function(snapshot) { 

     contactsVerifiedOnDatabase = snapshot.val(); 

     for (key in userContacts) { 
      //checks if a value for this key exists in `contactsVerifiedOnDatabase` 
      //if key dioes exist then add the key:value pair to matchedContacts 
     }; 

     removalRef.set(null); //remove the data at the node that triggered this onWrite function 
     completionRef.set(matchedContacts); //write the new data to the completion-node 

    }); 

}); 

Ich versuchte return vor completionRef.set(matchedContacts); setzen, aber das gibt mir immer noch den Fehler. Ich bin mir nicht sicher, was ich falsch mache und wie ich den Fehler beheben kann. Danke für Ihre Hilfe

Antwort

0

Versuchen:

return verifiedNumsRef.once('value').then(function(snapshot) { 
    contactsVerifiedOnDatabase = snapshot.val(); 

    for (key in userContacts) { 
     //checks if a value for this key exists in `contactsVerifiedOnDatabase` 
     //if key dioes exist then add the key:value pair to matchedContacts 
    }; 

    return Promise.all([ 
     removalRef.set(null), //remove the data at the node that triggered this onWrite function 
     completionRef.set(matchedContacts) 
    ]).then(_ => true); 
}); 
+0

Ok ich werde das versuchen. Kannst du erklären was 'Promise.all ([...])' ist? – MikeG

+1

@MikeG Weitere Informationen zu Versprechungen und zur Funktionsweise von Cloud Functions finden Sie in diesem Blog mit eingebettetem Video: https://firebase.googleblog.com/2017/06/servieren-ihr-versprechen-was-verwenden-cloud.html –

+1

@MichaelBleigh Ich bekomme immer noch den gleichen Fehler nach dem Ausprobieren – MikeG

7

ich genau das gleiche Problem hatte, wenn mehrere Versprechen der Rückkehr, die Transaktionen auf der Datenbank Firebase waren. Zuerst war ich Aufruf:

return Promise.all(promises); 

Mein promises Objekt ist ein Array, das ich benutze, wo ich alle Aufträge bin drängen, die durch den Aufruf promises.push(<add job here>) ausgeführt werden müssen. Ich denke, dass dies eine effektive Art ist, die Jobs auszuführen, da die Jobs nun parallel laufen.

Die Cloud-Funktion funktionierte, aber ich bekam genau den gleichen Fehler, den Sie beschreiben.

Aber, wie Michael Bleigh auf seinem Kommentar vorgeschlagen, das Hinzufügen then das Problem behoben, und ich bin nicht mehr, dass Fehler zu sehen:

return Promise.all(promises).then(() => { 
    return true; 
}).catch(er => { 
    console.error('...', er); 
}); 

Wenn das Ihr Problem nicht beheben, vielleicht müssen Sie Ihre konvertieren kreisförmiges Objekt in ein JSON-Format. Ein Beispiel ist hier geschrieben, aber ich habe das nicht versucht: https://stackoverflow.com/a/42950571/658323 (es verwendet die circular-json-Bibliothek).

UPDATE Dezember 2017: Es scheint, dass in der neuesten Version Cloud-Funktionen wird eine Cloud-Funktion einen Rückgabewert erwarten (entweder ein Versprechen oder ein Wert), so verursacht return; folgende Fehlermeldung: wird Function returned undefined, expected Promise or value obwohl die Funktion ausgeführt werden. Wenn Sie also keine Zusage zurückgeben und die Cloud-Funktion beendet werden soll, können Sie einen zufälligen Wert, z. return true;

+1

Vielen dank für das Update vom Dez 2017! – johnozbay

0

Ich hatte die gleiche Fehlerausgabe mit einem ziemlich ähnlichen Setup und konnte nicht herausfinden, wie man diesen Fehler los wird. Ich bin mir nicht ganz sicher, ob jede Essenz von den vorherigen Antworten erfasst wurde, also überlasse ich dir meine Lösung, vielleicht hilft es dir.

Ursprünglich sah mein Code wie folgt aus:

return emergencyNotificationInformation.once('value', (data) => { 
    ... 
    return; 
}); 

Aber nach dem Hinzufügen dann und den Fehler fangen ging weg.

return emergencyNotificationInformation.once('value') 
    .then((data) => { 
     ... 
     return; 
    }) 
    .catch((error) => { 
     ... 
     return: 
    }); 
} 
Verwandte Themen