J'ai ce qui suit ...
chrome.extension.sendRequest({
req: "getDocument",
docu: pagedoc,
name: 'name'
}, function(response){
var efjs = response.reply;
});
qui appelle ce qui suit ..
case "getBrowserForDocumentAttribute":
alert("ZOMG HERE");
sendResponse({
reply: getBrowserForDocumentAttribute(request.docu,request.name)
});
break;
Cependant, mon code n'atteint jamais "ZOMG ICI" mais génère plutôt l'erreur suivante lors de l'exécution chrome.extension.sendRequest
Uncaught TypeError: Converting circular structure to JSON
chromeHidden.JSON.stringify
chrome.Port.postMessage
chrome.initExtension.chrome.extension.sendRequest
suggestQuery
Quelqu'un at-il une idée de ce qui cause cela?
pagedoc
?pagedoc
? 2. Référence circulaire:a = {}; a.b = a;
Réponses:
Cela signifie que l'objet que vous passez dans la demande (je suppose que c'est le cas
pagedoc
) a une référence circulaire, quelque chose comme:JSON.stringify
ne peut pas convertir des structures comme celle-ci.NB : Ce serait le cas des nœuds DOM, qui ont des références circulaires, même s'ils ne sont pas attachés à l'arborescence DOM. Chaque nœud a un
ownerDocument
qui fait référencedocument
dans la plupart des cas.document
a une référence à l'arbre DOM au moins à traversdocument.body
etdocument.body.ownerDocument
renvoie àdocument
nouveau, ce qui est seulement une des multiples références circulaires dans l'arbre DOM.la source
document
objet?try...catch
pour attraper cette erreur.Selon les documents JSON de Mozilla ,
JSON.Stringify
a un deuxième paramètrecensor
qui peut être utilisé pour filtrer / ignorer les éléments enfants lors de l'analyse de l'arborescence. Cependant, vous pouvez peut-être éviter les références circulaires.Dans Node.js, nous ne pouvons pas. Nous pouvons donc faire quelque chose comme ceci:
Le résultat:
Malheureusement, il semble y avoir un maximum de 30 itérations avant de supposer automatiquement qu'il est circulaire. Sinon, cela devrait fonctionner. J'ai même utilisé
areEquivalent
d'ici , maisJSON.Stringify
jette toujours l'exception après 30 itérations. Pourtant, c'est assez bon pour obtenir une représentation décente de l'objet à un niveau supérieur, si vous en avez vraiment besoin. Peut-être que quelqu'un peut améliorer cela? Dans Node.js pour un objet de requête HTTP, j'obtiens:J'ai créé un petit module Node.js pour le faire ici: https://github.com/ericmuyser/stringy N'hésitez pas à améliorer / contribuer!
la source
'[Unknown:' + typeof(value) + ']'
vous verrez comment corriger la censure pour traiter correctement les fonctions et certains autres types.Une approche consiste à retirer l'objet et les fonctions de l'objet principal. Et stringify la forme plus simple
la source
J'utilise normalement le paquetage circulaire-json npm pour résoudre ce problème.
Remarque: circular-json est obsolète, j'utilise maintenant flat (du créateur de CircularJSON):
sur: https://www.npmjs.com/package/flatted
la source
Basé sur la réponse de zainengineer ... Une autre approche consiste à faire une copie complète de l'objet et à supprimer les références circulaires et à filtrer le résultat.
la source
Il ne s'agit peut-être pas d'une réponse connexe, mais ce lien Détection et correction des références circulaires en JavaScript peut être utile pour détecter les objets qui provoquent une dépendance circulaire.
la source
Je résous ce problème sur NodeJS comme ceci:
la source
J'ai rencontré la même erreur lors de la création du message ci-dessous avec jQuery. La référence circulaire se produit lors d'
reviewerName
une affectation par erreur àmsg.detail.reviewerName
. .Val () de JQuery a résolu le problème, voir dernière ligne.la source
J'obtenais la même erreur avec jQuery formvaliadator, mais quand j'ai supprimé un console.log dans success: function, cela a fonctionné.
la source
Pour mon cas, j'obtenais cette erreur lorsque j'utilisais la
async
fonction côté serveur pour récupérer des documents à l'aide de mangouste. Il s'est avéré que la raison était que j'avais oublié de mettreawait
avant d'appeler lafind({})
méthode. L'ajout de cette partie a résolu mon problème.la source
Cela fonctionne et vous indique quelles propriétés sont circulaires. Il permet également de reconstruire l'objet avec les références
Exemple avec beaucoup de bruit supprimé:
Pour reconstruire, appelez JSON.parse (), puis parcourez les propriétés à la recherche de la
[Circular Reference]
balise. Ensuite, coupez cela et ... évaluez ... avecthis
ensemble sur l'objet racine.N'évaluez rien qui puisse être piraté. Une meilleure pratique serait de
string.split('.')
rechercher ensuite les propriétés par nom pour définir la référence.la source