616 Stimmen

Chrome sendrequest Fehler: TypeError: Umwandlung einer kreisförmigen Struktur in JSON

Ich habe die folgenden...

chrome.extension.sendRequest({
  req: "getDocument",
  docu: pagedoc,
  name: 'name'
}, function(response){
  var efjs = response.reply;
});

die das folgende aufruft.

case "getBrowserForDocumentAttribute":
  alert("ZOMG HERE");
  sendResponse({
    reply: getBrowserForDocumentAttribute(request.docu,request.name)
  });
  break;

Mein Code erreicht jedoch nie "ZOMG HERE", sondern gibt beim Ausführen den folgenden Fehler aus chrome.extension.sendRequest

 Uncaught TypeError: Converting circular structure to JSON
 chromeHidden.JSON.stringify
 chrome.Port.postMessage
 chrome.initExtension.chrome.extension.sendRequest
 suggestQuery

Hat jemand eine Idee, was die Ursache dafür ist?

8voto

ArtemNovikov Punkte 161

In meinem Fall habe ich beim Erstellen der Route einfach vergessen, async/await zu verwenden:

app.get('/products', async (req, res) => {
    const products = await Product.find();
    res.send(products );
});

6voto

MiF Punkte 592

Ich löse dieses Problem auf NodeJS wie folgt:

var util = require('util');

// Our circular object
var obj = {foo: {bar: null}, a:{a:{a:{a:{a:{a:{a:{hi: 'Yo!'}}}}}}}};
obj.foo.bar = obj;

// Generate almost valid JS object definition code (typeof string)
var str = util.inspect(b, {depth: null});

// Fix code to the valid state (in this example it is not required, but my object was huge and complex, and I needed this for my case)
str = str
    .replace(/<Buffer[ \w\.]+>/ig, '"buffer"')
    .replace(/\[Function]/ig, 'function(){}')
    .replace(/\[Circular]/ig, '"Circular"')
    .replace(/\{ \[Function: ([\w]+)]/ig, '{ $1: function $1 () {},')
    .replace(/\[Function: ([\w]+)]/ig, 'function $1(){}')
    .replace(/(\w+): ([\w :]+GMT\+[\w \(\)]+),/ig, '$1: new Date("$2"),')
    .replace(/(\S+): ,/ig, '$1: null,');

// Create function to eval stringifyed code
var foo = new Function('return ' + str + ';');

// And have fun
console.log(JSON.stringify(foo(), null, 4));

5voto

Mussa Charles Punkte 3218

In meinem Fall erhielt ich diesen Fehler, wenn ich async Funktion auf meiner Server-Seite, um Dokumente mit Mongoose zu holen. Es stellte sich heraus, dass der Grund dafür war, dass ich vergessen hatte, die Funktion await vor dem Aufruf find({}) Methode. Durch Hinzufügen dieses Teils wurde mein Problem behoben.

5voto

Derek Ziemba Punkte 2346

Dies funktioniert und zeigt Ihnen, welche Eigenschaften kreisförmig sind. Es ermöglicht auch die Rekonstruktion des Objekts mit den Referenzen

  JSON.stringifyWithCircularRefs = (function() {
    const refs = new Map();
    const parents = [];
    const path = ["this"];

    function clear() {
      refs.clear();
      parents.length = 0;
      path.length = 1;
    }

    function updateParents(key, value) {
      var idx = parents.length - 1;
      var prev = parents[idx];
      if (prev[key] === value || idx === 0) {
        path.push(key);
        parents.push(value);
      } else {
        while (idx-- >= 0) {
          prev = parents[idx];
          if (prev[key] === value) {
            idx += 2;
            parents.length = idx;
            path.length = idx;
            --idx;
            parents[idx] = value;
            path[idx] = key;
            break;
          }
        }
      }
    }

    function checkCircular(key, value) {
      if (value != null) {
        if (typeof value === "object") {
          if (key) { updateParents(key, value); }

          let other = refs.get(value);
          if (other) {
            return '[Circular Reference]' + other;
          } else {
            refs.set(value, path.join('.'));
          }
        }
      }
      return value;
    }

    return function stringifyWithCircularRefs(obj, space) {
      try {
        parents.push(obj);
        return JSON.stringify(obj, checkCircular, space);
      } finally {
        clear();
      }
    }
  })();

Beispiel, bei dem ein großer Teil des Rauschens entfernt wurde:

{
    "requestStartTime": "2020-05-22...",
    "ws": {
        "_events": {},
        "readyState": 2,
        "_closeTimer": {
            "_idleTimeout": 30000,
            "_idlePrev": {
                "_idleNext": "[Circular Reference]this.ws._closeTimer",
                "_idlePrev": "[Circular Reference]this.ws._closeTimer",
                "expiry": 33764,
                "id": -9007199254740987,
                "msecs": 30000,
                "priorityQueuePosition": 2
            },
            "_idleNext": "[Circular Reference]this.ws._closeTimer._idlePrev",
            "_idleStart": 3764,
            "_destroyed": false
        },
        "_closeCode": 1006,
        "_extensions": {},
        "_receiver": {
            "_binaryType": "nodebuffer",
            "_extensions": "[Circular Reference]this.ws._extensions",
        },
        "_sender": {
            "_extensions": "[Circular Reference]this.ws._extensions",
            "_socket": {
                "_tlsOptions": {
                    "pipe": false,
                    "secureContext": {
                        "context": {},
                        "singleUse": true
                    },
                },
                "ssl": {
                    "_parent": {
                        "reading": true
                    },
                    "_secureContext": "[Circular Reference]this.ws._sender._socket._tlsOptions.secureContext",
                    "reading": true
                }
            },
            "_firstFragment": true,
            "_compress": false,
            "_bufferedBytes": 0,
            "_deflating": false,
            "_queue": []
        },
        "_socket": "[Circular Reference]this.ws._sender._socket"
    }
}

Zur Rekonstruktion rufen Sie JSON.parse() auf und durchlaufen dann eine Schleife durch die Eigenschaften auf der Suche nach dem [Circular Reference] Tag. Dann schneiden Sie es ab und ... bewerten Sie es mit ... this auf das Root-Objekt gesetzt.

Entwickeln Sie nichts, was gehackt werden kann. Eine bessere Praxis wäre es, Folgendes zu tun string.split('.') und suchen Sie dann die Eigenschaften anhand ihres Namens, um den Verweis festzulegen.

3voto

Altaf Punkte 61

Ich bekam in ein anderes Problem hier, ich nahm Werte von HTML-Elementen in ein Objekt-Array, in einem Feld war ich Werte falsch zuweisen, die diese Ausnahme verursacht wurde. Falscher Ausdruck: obj.firstname=$("txFirstName") Richtiger Ausdruck: obj.firstname=$("txFirstName").val()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X