Tengo lo siguiente ...
chrome.extension.sendRequest({
req: "getDocument",
docu: pagedoc,
name: 'name'
}, function(response){
var efjs = response.reply;
});
que llama a lo siguiente ...
case "getBrowserForDocumentAttribute":
alert("ZOMG HERE");
sendResponse({
reply: getBrowserForDocumentAttribute(request.docu,request.name)
});
break;
Sin embargo, mi código nunca llega a "ZOMG AQUÍ", sino que arroja el siguiente error mientras se ejecuta chrome.extension.sendRequest
Uncaught TypeError: Converting circular structure to JSON
chromeHidden.JSON.stringify
chrome.Port.postMessage
chrome.initExtension.chrome.extension.sendRequest
suggestQuery
¿Alguien tiene alguna idea de lo que está causando esto?
pagedoc
?pagedoc
? 2. Referencia circular:a = {}; a.b = a;
Respuestas:
Significa que el objeto que pasa en la solicitud (supongo que es
pagedoc
) tiene una referencia circular, algo así como:JSON.stringify
no puede convertir estructuras como esta.NB : este sería el caso con los nodos DOM, que tienen referencias circulares, incluso si no están conectados al árbol DOM. Cada nodo tiene un
ownerDocument
que se refieredocument
en la mayoría de los casos.document
tiene una referencia al árbol DOM al menos a travésdocument.body
ydocument.body.ownerDocument
vuelve a referirse a éldocument
, que es solo una de las múltiples referencias circulares en el árbol DOM.fuente
document
objeto?try...catch
para detectar este error.Según los documentos JSON en Mozilla ,
JSON.Stringify
tiene un segundo parámetrocensor
que se puede usar para filtrar / ignorar elementos secundarios mientras se analiza el árbol. Sin embargo, quizás pueda evitar las referencias circulares.En Node.js no podemos. Entonces podemos hacer algo como esto:
El resultado:
Desafortunadamente, parece haber un máximo de 30 iteraciones antes de asumir automáticamente que es circular. De lo contrario, esto debería funcionar. Incluso lo usé
areEquivalent
desde aquí , peroJSON.Stringify
aún arroja la excepción después de 30 iteraciones. Aún así, es lo suficientemente bueno para obtener una representación decente del objeto en un nivel superior, si realmente lo necesita. ¿Quizás alguien pueda mejorar esto? En Node.js para un objeto de solicitud HTTP, obtengo:Creé un pequeño módulo Node.js para hacer esto aquí: https://github.com/ericmuyser/stringy ¡ Siéntase libre de mejorar / contribuir!
fuente
'[Unknown:' + typeof(value) + ']'
, verá cómo arreglar el censor para tratar adecuadamente las funciones y algunos otros tipos.Un enfoque es quitar objetos y funciones del objeto principal. Y stringify la forma más simple
fuente
Normalmente uso el paquete circular-json npm para resolver esto.
Nota: circular-json ha quedado en desuso, ahora uso flatted (del creador de CircularJSON):
de: https://www.npmjs.com/package/flatted
fuente
Basado en la respuesta de zainengineer ... Otro enfoque es hacer una copia profunda del objeto y quitar referencias circulares y stringificar el resultado.
fuente
Puede que esta no sea una respuesta relacionada, pero este enlace Detectar y corregir referencias circulares en JavaScript puede ser útil para detectar objetos que causan dependencia circular.
fuente
Resuelvo este problema en NodeJS así:
fuente
Experimenté el mismo error al intentar construir el mensaje a continuación con jQuery. La referencia circular ocurre cuando
reviewerName
se le asignó por errormsg.detail.reviewerName
. El .val () de JQuery solucionó el problema, vea la última línea.fuente
Estaba recibiendo el mismo error con jQuery formvaliadator, pero cuando eliminé un console.log dentro del éxito: funcionó, funcionó.
fuente
Para mi caso, recibí ese error cuando estaba usando la
async
función en mi lado del servidor para buscar documentos usando mangosta. Resultó que la razón fue que olvidé ponerloawait
antes de llamar alfind({})
método. Agregar esa parte solucionó mi problema.fuente
Esto funciona y le dice qué propiedades son circulares. También permite reconstruir el objeto con las referencias.
Ejemplo con mucho ruido eliminado:
Para reconstruir, llame a JSON.parse () y luego recorra las propiedades buscando la
[Circular Reference]
etiqueta. Luego córtalo y ... evalúalo con elthis
conjunto al objeto raíz.No evalúes nada que pueda ser pirateado. Una mejor práctica sería hacer
string.split('.')
luego buscar las propiedades por nombre para establecer la referencia.fuente