Eu tenho o seguinte ...
chrome.extension.sendRequest({
req: "getDocument",
docu: pagedoc,
name: 'name'
}, function(response){
var efjs = response.reply;
});
que chama o seguinte ..
case "getBrowserForDocumentAttribute":
alert("ZOMG HERE");
sendResponse({
reply: getBrowserForDocumentAttribute(request.docu,request.name)
});
break;
No entanto, meu código nunca atinge "ZOMG HERE", mas gera o seguinte erro ao executar chrome.extension.sendRequest
Uncaught TypeError: Converting circular structure to JSON
chromeHidden.JSON.stringify
chrome.Port.postMessage
chrome.initExtension.chrome.extension.sendRequest
suggestQuery
Alguém tem alguma idéia do que está causando isso?
pagedoc
?pagedoc
? 2. Referência circular:a = {}; a.b = a;
Respostas:
Isso significa que o objeto que você passa na solicitação (eu acho que é
pagedoc
) tem uma referência circular, algo como:JSON.stringify
não pode converter estruturas como esta.NB : Este seria o caso dos nós DOM, que possuem referências circulares, mesmo que não estejam anexados à árvore DOM. Cada nó tem um
ownerDocument
que se referedocument
na maioria dos casos.document
tem uma referência à árvore DOM pelo menos atravésdocument.body
edocument.body.ownerDocument
se referedocument
novamente, que é apenas uma das várias referências circulares na árvore DOM.fonte
document
objeto?try...catch
para capturar esse erro.De acordo com os documentos JSON no Mozilla ,
JSON.Stringify
tem um segundo parâmetrocensor
que pode ser usado para filtrar / ignorar itens filhos enquanto analisa a árvore. No entanto, talvez você possa evitar as referências circulares.No Node.js não podemos. Para que possamos fazer algo assim:
O resultado:
Infelizmente, parece haver um máximo de 30 iterações antes de assumir automaticamente que é circular. Caso contrário, isso deve funcionar. Eu até usei a
areEquivalent
partir daqui , masJSON.Stringify
ainda gera a exceção após 30 iterações. Ainda assim, é bom o suficiente para obter uma representação decente do objeto em um nível superior, se você realmente precisar. Talvez alguém possa melhorar isso? No Node.js para um objeto de solicitação HTTP, estou recebendo:Criei um pequeno módulo Node.js para fazer isso aqui: https://github.com/ericmuyser/stringy Sinta-se à vontade para melhorar / contribuir!
fonte
'[Unknown:' + typeof(value) + ']'
, verá como corrigir o censor para tratar adequadamente as funções e alguns outros tipos.Uma abordagem é retirar objetos e funções do objeto principal. E stringify a forma mais simples
fonte
Normalmente, uso o pacote circular-json npm para resolver isso.
Nota: circular-json foi descontinuado, agora uso flatted (do criador do CircularJSON):
from: https://www.npmjs.com/package/flatted
fonte
Com base na resposta do zainengineer ... Outra abordagem é fazer uma cópia profunda do objeto e remover referências circulares e restringir o resultado.
fonte
Isso pode não estar relacionado à resposta, mas esse link Detectar e corrigir referências circulares em JavaScript pode ser útil para detectar objetos que estão causando dependência circular.
fonte
Eu resolvo esse problema no NodeJS assim:
fonte
Eu experimentei o mesmo erro ao tentar criar a mensagem abaixo com o jQuery. A referência circular acontece quando
reviewerName
estava sendo atribuída por enganomsg.detail.reviewerName
. O .val () do JQuery corrigiu o problema, veja a última linha.fonte
Eu estava recebendo o mesmo erro com o jQuery formvaliadator, mas quando removi um console.log dentro de success: function, ele funcionou.
fonte
No meu caso, eu estava recebendo esse erro quando estava usando a
async
função no lado do servidor para buscar documentos usando o mangusto. Acabou que a razão pela qual eu esqueci de colocarawait
antes de chamar ofind({})
método. A adição dessa parte corrigiu meu problema.fonte
Isso funciona e informa quais propriedades são circulares. Também permite reconstruir o objeto com as referências
Exemplo com muito ruído removido:
Para reconstruir a chamada JSON.parse (), faça um loop pelas propriedades procurando a
[Circular Reference]
tag. Depois pique e ... avaliá-lo comthis
o objeto raiz.Não avalie nada que possa ser hackeado. A melhor prática seria
string.split('.')
procurar as propriedades pelo nome para definir a referência.fonte