Fonctions de cloud pour Firebase – Erreur lors de la sérialisation de la valeur renvoyée:

J’ai une fonction de nuage utilisée pour référencer deux listes et trouver des valeurs qui se correspondent sur les listes. La fonction semble fonctionner correctement, cependant, dans les journaux, cette Error serializing return value: TypeError: Converting circular structure to JSON . Voici la fonction …

 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 sortingggered this onWrite function completionRef.set(matchedContacts); //write the new data to the completion-node }); }); 

J’ai essayé de mettre le return en face de completionRef.set(matchedContacts); mais cela me donne toujours l’erreur. Pas sûr de ce que je fais mal et comment débarrasser l’erreur. Merci de votre aide

J’avais exactement le même problème lorsque je renvoyais plusieurs promesses correspondant à des transactions dans la firebase database Firebase. Au début j’appelais:

 return Promise.all(promises); 

Mon object promises est un tableau que j’utilise et dans lequel je pousse tous les travaux à exécuter en appelant promises.push() . Je suppose que c’est un moyen efficace d’exécuter les travaux, car ceux-ci seront exécutés en parallèle.

La fonction de nuage a fonctionné, mais j’avais exactement l’erreur que vous décrivez.

Mais, comme Michael Bleigh l’a suggéré dans son commentaire, l’ajout a then résolu le problème et je ne vois plus cette erreur:

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

Si cela ne résout pas le problème, vous devrez peut-être convertir votre object circulaire au format JSON. Un exemple est écrit ici, mais je n’ai pas essayé cela: https://stackoverflow.com/a/42950571/658323 (il utilise la bibliothèque circular-json).

MISE À JOUR Décembre 2017: il semble que dans la dernière version de Cloud Functions, une fonction cloud attend une valeur de retour (une promesse ou une valeur), donc return; provoquera l’erreur suivante: La Function returned undefined, expected Promise or value bien que la fonction soit exécutée. Par conséquent, lorsque vous ne retournez pas une promesse et que vous souhaitez que la fonction cloud se termine, vous pouvez renvoyer une valeur aléatoire, telle que return true; , par exemple return true;

Essayer:

 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 sortingggered this onWrite function completionRef.set(matchedContacts) ]).then(_ => true); }); 

J’ai eu la même erreur de sortie avec une configuration assez similaire et je ne pouvais pas comprendre comment se débarrasser de cette erreur. Je ne suis pas tout à fait sûr que chaque réponse ait capturé chaque essence, alors je vous laisse ma solution, peut-être que cela vous aidera.

À l’origine, mon code ressemblait à ceci:

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

Mais après avoir ajouté, l’erreur a disparu.

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

Nous avons corrigé un problème similaire avec la même erreur en renvoyant Promise.resolve() en bas de la chaîne, par exemple:

 return event.data.ref.parent.child('subject').once('value') .then(snapshot => { console.log(snapshot.val()); Promise.resolve(); }).catch(error => { console.error(error.toSsortingng()); });