616 votes

Chrome erreur sendrequest : TypeError : conversion structure circulaire en JSON

I've got ce qui suit...

qui appelle ce qui suit...

Cependant, mon code n’atteint jamais « ZOMG ici » mais plutôt jette l’erreur suivante lors de l’exécution``

Quelqu'un a-t-il une idée, ce qui est la cause ?

675voto

Felix Kling Points 247451

Cela signifie que l'objet que vous transmettez la demande (je suppose que c'est - pagedoc) a une référence circulaire, quelque chose comme:

var a = {};
a.b = a;

JSON.stringify ne peut pas convertir des structures de ce genre.

N. B.: Ce serait le cas avec les nœuds DOM, qui ont des références circulaires, même si elles ne sont pas attachées à l'arbre du DOM. Chaque nœud a un ownerDocument qui se réfère à l' document dans la plupart des cas. document a une référence à l'arbre du DOM au moins jusqu' document.body et document.body.ownerDocument renvoie à l' document nouveau, qui n'est qu' un des multiples références circulaires dans l'arborescence DOM.

189voto

Eric Muyser Points 1276

Comme par le JSON docs chez Mozilla, JSON.Stringify a un deuxième paramètre censor qui peut être utilisé pour filtrer/ignorer les enfants lors de l'analyse de l'arbre. Cependant, peut-être vous pouvez éviter les références circulaires.

Dans Node.js nous ne pouvons pas. Donc, nous pouvons faire quelque chose comme ceci:

function censor(censor) {
  var i = 0;

  return function(key, value) {
    if(i !== 0 && typeof(censor) === 'object' && typeof(value) == 'object' && censor == value) 
      return '[Circular]'; 

    if(i >= 29) // seems to be a harded maximum of 30 serialized objects?
      return '[Unknown]';

    ++i; // so we know we aren't using the original object anymore

    return value;  
  }
}

var b = {foo: {bar: null}};

b.foo.bar = b;

console.log("Censoring: ", b);

console.log("Result: ", JSON.stringify(b, censor(b)));

Le résultat:

Censoring:  { foo: { bar: [Circular] } }
Result: {"foo":{"bar":"[Circular]"}}

Malheureusement, il semble y avoir un maximum de 30 itérations avant qu'il suppose automatiquement qu'il est circulaire. Sinon, cela devrait fonctionner. J'ai même utilisé areEquivalent d'ici, mais JSON.Stringify en jette toujours l'exception après 30 itérations. Pourtant, il est assez bon pour obtenir une bonne représentation de l'objet à un haut niveau, si vous en avez vraiment besoin. Peut-être que quelqu'un peut améliorer sur ce bien? Dans Node.js pour une requête HTTP objet, j'obtiens:

{
"limit": null,
"size": 0,
"chunks": [],
"writable": true,
"readable": false,
"_events": {
    "pipe": [null, null],
    "error": [null]
},
"before": [null],
"after": [],
"response": {
    "output": [],
    "outputEncodings": [],
    "writable": true,
    "_last": false,
    "chunkedEncoding": false,
    "shouldKeepAlive": true,
    "useChunkedEncodingByDefault": true,
    "_hasBody": true,
    "_trailer": "",
    "finished": false,
    "socket": {
        "_handle": {
            "writeQueueSize": 0,
            "socket": "[Unknown]",
            "onread": "[Unknown]"
        },
        "_pendingWriteReqs": "[Unknown]",
        "_flags": "[Unknown]",
        "_connectQueueSize": "[Unknown]",
        "destroyed": "[Unknown]",
        "bytesRead": "[Unknown]",
        "bytesWritten": "[Unknown]",
        "allowHalfOpen": "[Unknown]",
        "writable": "[Unknown]",
        "readable": "[Unknown]",
        "server": "[Unknown]",
        "ondrain": "[Unknown]",
        "_idleTimeout": "[Unknown]",
        "_idleNext": "[Unknown]",
        "_idlePrev": "[Unknown]",
        "_idleStart": "[Unknown]",
        "_events": "[Unknown]",
        "ondata": "[Unknown]",
        "onend": "[Unknown]",
        "_httpMessage": "[Unknown]"
    },
    "connection": "[Unknown]",
    "_events": "[Unknown]",
    "_headers": "[Unknown]",
    "_headerNames": "[Unknown]",
    "_pipeCount": "[Unknown]"
},
"headers": "[Unknown]",
"target": "[Unknown]",
"_pipeCount": "[Unknown]",
"method": "[Unknown]",
"url": "[Unknown]",
"query": "[Unknown]",
"ended": "[Unknown]"
}

2voto

izilotti Points 1339

J’ai connu la même erreur lorsque vous essayez de construire le message ci-dessous avec jQuery. La référence circulaire se produit lorsque a été attribué par erreur à . .Val() de JQuery, correction du problème, voir la dernière ligne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X