Ich habe folgendes ...
chrome.extension.sendRequest({
req: "getDocument",
docu: pagedoc,
name: 'name'
}, function(response){
var efjs = response.reply;
});
das ruft folgendes auf ..
case "getBrowserForDocumentAttribute":
alert("ZOMG HERE");
sendResponse({
reply: getBrowserForDocumentAttribute(request.docu,request.name)
});
break;
Mein Code erreicht jedoch nie "ZOMG HERE", sondern löst beim Ausführen den folgenden Fehler aus chrome.extension.sendRequest
Uncaught TypeError: Converting circular structure to JSON
chromeHidden.JSON.stringify
chrome.Port.postMessage
chrome.initExtension.chrome.extension.sendRequest
suggestQuery
Hat jemand eine Ahnung, was das verursacht?
pagedoc
?pagedoc
? 2. Rundschreiben:a = {}; a.b = a;
Antworten:
Dies bedeutet, dass das Objekt, das Sie in der Anfrage übergeben (ich denke es ist
pagedoc
), einen Zirkelverweis hat, etwa:JSON.stringify
Strukturen wie diese können nicht konvertiert werden.NB : Dies wäre bei DOM-Knoten der Fall, die Zirkelverweise haben, auch wenn sie nicht an den DOM-Baum angehängt sind. Jeder Knoten hat eine
ownerDocument
, auf diedocument
in den meisten Fällen verwiesen wird.document
hat mindestens durch einen Verweis auf den DOM-Baumdocument.body
unddocument.body.ownerDocument
verweistdocument
erneut auf diesen, der nur einer von mehreren Zirkelverweisen im DOM-Baum ist.quelle
document
Objekt stringifizieren ?try...catch
diesen Fehler abfangen.Gemäß den JSON - Dokumente bei Mozilla ,
JSON.Stringify
hat einen zweiten Parametercensor
, die Filter verwendet werden kann / Kinder Elemente ignorieren , während die Baum Parsen. Vielleicht können Sie jedoch die Zirkelverweise vermeiden.In Node.js können wir nicht. Also können wir so etwas machen:
Das Ergebnis:
Leider scheint es maximal 30 Iterationen zu geben, bevor automatisch angenommen wird, dass es kreisförmig ist. Andernfalls sollte dies funktionieren. Ich habe es sogar
areEquivalent
von hier aus verwendet , aberJSON.Stringify
nach 30 Iterationen wird immer noch die Ausnahme ausgelöst. Trotzdem ist es gut genug, um eine anständige Darstellung des Objekts auf oberster Ebene zu erhalten, wenn Sie es wirklich brauchen. Vielleicht kann jemand das verbessern? In Node.js für ein HTTP-Anforderungsobjekt erhalte ich Folgendes:Ich habe ein kleines Node.js-Modul erstellt, um dies hier zu tun: https://github.com/ericmuyser/stringy Fühlen Sie sich frei, sich zu verbessern / beizutragen!
quelle
'[Unknown:' + typeof(value) + ']'
Sie sehen, wie Sie den Zensor reparieren, um Funktionen und einige andere Typen richtig zu behandeln.Ein Ansatz besteht darin, Objekte und Funktionen vom Hauptobjekt zu entfernen. Und stringifizieren Sie die einfachere Form
quelle
Normalerweise verwende ich das Circular-JSON-Npm-Paket, um dies zu lösen.
Hinweis: Circular-JSON ist veraltet, ich verwende jetzt Flatted (vom Ersteller von CircularJSON):
von: https://www.npmjs.com/package/flatted
quelle
Basierend auf der Antwort von zainengineer ... Ein anderer Ansatz besteht darin, eine tiefe Kopie des Objekts zu erstellen, Zirkelverweise zu entfernen und das Ergebnis zu stringifizieren.
quelle
Dies ist möglicherweise keine verwandte Antwort, aber dieser Link Das Erkennen und Korrigieren von Zirkelverweisen in JavaScript kann hilfreich sein, um Objekte zu erkennen , die eine Zirkularabhängigkeit verursachen.
quelle
Ich löse dieses Problem auf NodeJS folgendermaßen:
quelle
Beim Versuch, die folgende Nachricht mit jQuery zu erstellen, ist der gleiche Fehler aufgetreten. Der Zirkelverweis tritt auf, wenn
reviewerName
er fälschlicherweise zugewiesen wurdemsg.detail.reviewerName
. JQuerys .val () hat das Problem behoben, siehe letzte Zeile.quelle
Ich habe den gleichen Fehler mit jQuery formvaliadator erhalten, aber als ich ein console.log innerhalb der success: function entfernt habe, hat es funktioniert.
quelle
In meinem Fall wurde dieser Fehler angezeigt, als ich die
async
Funktion auf meiner Serverseite zum Abrufen von Dokumenten mit Mungo verwendete. Es stellte sich heraus, dass der Grund war, dass ich vergessen hatte,await
vor dem Aufruf derfind({})
Methode zu setzen . Das Hinzufügen dieses Teils hat mein Problem behoben.quelle
Dies funktioniert und zeigt Ihnen, welche Eigenschaften kreisförmig sind. Es ermöglicht auch die Rekonstruktion des Objekts mit den Referenzen
Beispiel mit viel entferntem Rauschen:
Um zu rekonstruieren, rufen Sie JSON.parse () auf und durchlaufen Sie die Eigenschaften, um nach dem
[Circular Reference]
Tag zu suchen . Dann hacke das ab und ... bewerte ... es mitthis
set auf das Root-Objekt.Bewerten Sie nichts, was gehackt werden kann. Besser wäre es,
string.split('.')
die Eigenschaften nach Namen zu suchen, um die Referenz festzulegen.quelle