У меня есть следующее ...
chrome.extension.sendRequest({
req: "getDocument",
docu: pagedoc,
name: 'name'
}, function(response){
var efjs = response.reply;
});
который вызывает следующее ..
case "getBrowserForDocumentAttribute":
alert("ZOMG HERE");
sendResponse({
reply: getBrowserForDocumentAttribute(request.docu,request.name)
});
break;
Тем не менее, мой код никогда не достигает "ZOMG ЗДЕСЬ", а скорее выдает следующую ошибку при запуске chrome.extension.sendRequest
Uncaught TypeError: Converting circular structure to JSON
chromeHidden.JSON.stringify
chrome.Port.postMessage
chrome.initExtension.chrome.extension.sendRequest
suggestQuery
У кого-нибудь есть идеи, что вызывает это?
pagedoc
?pagedoc
? 2. Циркулярная ссылка:a = {}; a.b = a;
Ответы:
Это означает, что объект, который вы передаете в запросе (я предполагаю, что это так
pagedoc
), имеет циклическую ссылку, что-то вроде:JSON.stringify
не может конвертировать такие структурыNB : Это было бы в случае с узлами DOM, которые имеют циклические ссылки, даже если они не привязаны к дереву DOM. Каждый узел имеет ссылку, на
ownerDocument
которую ссылаетсяdocument
в большинстве случаев.document
имеет ссылку на дерево DOM, по крайней мере, черезdocument.body
иdocument.body.ownerDocument
ссылаетсяdocument
снова, что является лишь одной из нескольких циклических ссылок в дереве DOM.источник
document
объект?try...catch
чтобы поймать эту ошибку.Согласно документам JSON в Mozilla ,
JSON.Stringify
есть второй параметр,censor
который можно использовать для фильтрации / игнорирования дочерних элементов при анализе дерева. Однако, возможно, вы можете избежать циклических ссылок.В Node.js мы не можем. Таким образом, мы можем сделать что-то вроде этого:
Результат:
К сожалению, кажется, что максимум 30 итераций, прежде чем он автоматически примет круговую форму. В противном случае это должно работать. Я даже использовал
areEquivalent
отсюда , ноJSON.Stringify
все равно выдает исключение после 30 итераций. Тем не менее, достаточно хорошо получить достойное представление об объекте на верхнем уровне, если он вам действительно нужен. Возможно, кто-то может улучшить это хотя? В Node.js для объекта HTTP-запроса я получаю:Я создал небольшой модуль Node.js для этого здесь: https://github.com/ericmuyser/stringy Не стесняйтесь улучшать / вносить свой вклад!
источник
'[Unknown:' + typeof(value) + ']'
вы увидите, как исправить цензор, чтобы правильно обрабатывать функции и некоторые другие типы.Один из подходов состоит в том, чтобы отделить объект и функции от основного объекта. И зачеркните более простую форму
источник
Я обычно использую пакет Round-JSON для решения этой проблемы.
Примечание: циркуляр-json устарел, теперь я использую flatted (от создателя CircularJSON):
от: https://www.npmjs.com/package/flatted
источник
Основано на ответе zainengineer ... Другой подход заключается в создании глубокой копии объекта, отбрасывании круговых ссылок и строковом преобразовании результата.
источник
Это может быть не связанный ответ, но эта ссылка Обнаружение и исправление циклических ссылок в JavaScript может помочь обнаружить объекты , вызывающие циклическую зависимость.
источник
Я решаю эту проблему на NodeJS следующим образом:
источник
Я столкнулся с той же ошибкой при попытке построить сообщение ниже с помощью jQuery. Циркулярное указание происходит, когда
reviewerName
его ошибочно назначаютmsg.detail.reviewerName
. .Val () JQuery исправил проблему, смотрите последнюю строку.источник
Я получал ту же ошибку с jQuery formvaliadator, но когда я удалил console.log внутри success: function, это сработало.
источник
В моем случае я получал эту ошибку, когда использовал
async
функцию на своем сервере для получения документов с помощью mongoose. Оказалось, что причина была в том, что я забыл поставитьawait
перед вызовомfind({})
метода. Добавление этой части исправило мою проблему.источник
Это работает и говорит вам, какие свойства являются круглыми. Это также позволяет реконструировать объект со ссылками
Пример с удалением большого количества шума:
Чтобы восстановить вызов JSON.parse (), затем переберите свойства, ища
[Circular Reference]
тег. Затем отрубите это и ... оцените этоthis
установленным корневым объектом.Не оценивайте ничего, что можно взломать. Лучше практиковать
string.split('.')
поиск свойств по имени, чтобы установить ссылку.источник