Mam następujące ...
chrome.extension.sendRequest({
req: "getDocument",
docu: pagedoc,
name: 'name'
}, function(response){
var efjs = response.reply;
});
który wywołuje następujące ...
case "getBrowserForDocumentAttribute":
alert("ZOMG HERE");
sendResponse({
reply: getBrowserForDocumentAttribute(request.docu,request.name)
});
break;
Jednak mój kod nigdy nie osiąga „ZOMG TUTAJ”, ale generuje następujący błąd podczas działania chrome.extension.sendRequest
Uncaught TypeError: Converting circular structure to JSON
chromeHidden.JSON.stringify
chrome.Port.postMessage
chrome.initExtension.chrome.extension.sendRequest
suggestQuery
Czy ktoś ma pojęcie, co to powoduje?
pagedoc
?pagedoc
? 2. Odnośnik okólny:a = {}; a.b = a;
Odpowiedzi:
Oznacza to, że obiekt przekazywany w żądaniu (tak mi się wydaje
pagedoc
) ma okrągłe odniesienie, coś w stylu:JSON.stringify
nie może konwertować takich struktur.Uwaga : tak byłoby w przypadku węzłów DOM, które mają odwołania cykliczne, nawet jeśli nie są one dołączone do drzewa DOM. Każdy węzeł ma taki,
ownerDocument
którydocument
w większości przypadków odnosi się do .document
zawiera odniesienie do drzewa DOM przynajmniej przezdocument.body
idocument.body.ownerDocument
odwołuje siędocument
ponownie, który jest tylko jednym z wielu okrągłych odniesień w drzewie DOM.źródło
document
obiekt?try...catch
aby złapać ten błąd.Zgodnie z docs JSON w Mozilli ,
JSON.Stringify
posiada drugi parametrcensor
, który może być używany do filtra / ignorować dzieci przedmiotów podczas parsowania drzewa. Być może jednak można uniknąć okrągłych odniesień.W Node.js nie możemy. Możemy więc zrobić coś takiego:
Wynik:
Niestety wydaje się, że może być maksymalnie 30 iteracji, zanim automatycznie przyjmie, że jest kołowy. W przeciwnym razie powinno to działać. Użyłem nawet
areEquivalent
stąd , aleJSON.Stringify
nadal rzuca wyjątek po 30 iteracjach. Nadal wystarczy uzyskać przyzwoitą reprezentację obiektu na najwyższym poziomie, jeśli naprawdę go potrzebujesz. Być może jednak ktoś może to poprawić? W Node.js dla obiektu żądania HTTP otrzymuję:Stworzyłem mały moduł Node.js, aby to zrobić tutaj: https://github.com/ericmuyser/stringy Nie krępuj się ulepszać / przyczyniać się!
źródło
'[Unknown:' + typeof(value) + ']'
, zobaczysz, jak naprawić cenzurę, aby odpowiednio traktować funkcje i niektóre inne typy.Jednym z podejść jest usunięcie obiektu i funkcji z głównego obiektu. I sprecyzuj prostszą formę
źródło
Zwykle używam pakietu npm circular-json, aby rozwiązać ten problem.
Uwaga: okrągły-json został wycofany, teraz używam spłaszczonego (od twórcy CircularJSON):
od: https://www.npmjs.com/package/flatted
źródło
Oparty na odpowiedzi zainengineera ... Innym podejściem jest wykonanie głębokiej kopii obiektu i usunięcie okrągłych odniesień oraz zszeregowanie wyniku.
źródło
To może nie być odpowiednia odpowiedź, ale ten link Wykrywanie i naprawianie referencji cyklicznych w JavaScript może pomóc w wykryciu obiektów powodujących zależność cykliczną.
źródło
Rozwiązuję ten problem w NodeJS w następujący sposób:
źródło
Wystąpił ten sam błąd podczas próby zbudowania poniższego komunikatu za pomocą jQuery. Okrągłe odniesienie ma miejsce, gdy
reviewerName
został przypadkowo przypisanymsg.detail.reviewerName
. .Val () w JQuery naprawił problem, patrz ostatni wiersz.źródło
Otrzymałem ten sam błąd z formvaliadatorem jQuery, ale kiedy usunąłem console.log wewnątrz sukcesu: funkcja, zadziałało.
źródło
W moim przypadku ten błąd pojawiał się, gdy korzystałem z
async
funkcji po stronie serwera, aby pobierać dokumenty za pomocą mongoose. Okazało się, że powodem było to, że zapomniałem podaćawait
przed wywołaniemfind({})
metody. Dodanie tej części rozwiązało mój problem.źródło
To działa i mówi, które właściwości są okrągłe. Pozwala także na rekonstrukcję obiektu z referencjami
Przykład z dużą ilością usuniętego hałasu:
Aby zrekonstruować, wywołaj JSON.parse (), a następnie przejdź przez właściwości szukające
[Circular Reference]
znacznika. Następnie odetnij to i ... ewaluuj ... za pomocąthis
ustawiając obiekt główny.Nie sprawdzaj niczego, co można zhakować. Lepszą praktyką byłoby
string.split('.')
sprawdzenie właściwości według nazwy w celu ustawienia odniesienia.źródło