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?

-1voto

Laura Punkte 136

Node.js v10.22.1 (die Version, die auf unserem GitLab CI-Server läuft) hat einen, wie ich finde, fehlerhaften Circular Reference Detector. Die Version, die lokal läuft (v12.8.0) ist intelligent genug, um zu wissen, dass es sich nicht um eine echte zirkuläre Referenz handelt.

Ich füge diese Antwort für den Fall hinzu, dass jemand anderes das gleiche Problem hat und sein Objekt nicht wirklich ein Zirkelverweis ist.

Dies war das ursprüngliche Antwortobjekt:

var res = {
    "status":"OK",
    "message":"Success",
    "errCode":":",
    "data":"",
    "appCfg":{
        "acp_age":"2yy",
        "acp_us":"yes",
        "mode":"admin",
        "version":"v1.21.07.1"
    },
    "reqID":59833,
    "email":{
        "status":"OK",
        "message":"Success"
    },
    "emailStatus":"sent"
}

Sie dachte, dass res.email.status war derselbe wie res.status . Es ist nur ein Textelement, also nicht zirkulär, aber der Name und der Wert haben offenbar den JSON.stringify-Parser gestört.

Ich habe die res.email Unterobjekt und alles ist in Ordnung. Ich habe versucht, unabhängige Status und detaillierte Nachrichten von allen einzelnen Aktionen zu sammeln, die während des Serveraufrufs durchgeführt wurden. Ich habe es auf das Element res.emailStatus die auch in dem obigen Beispiel enthalten ist.

-1voto

Xin Punkte 27823

Wie bei MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#issue_with_json.stringify_when_serializing_circular_references

Es handelt sich um ein zirkuläres json, das nicht direkt konvertiert werden kann.

Lösung 1:

https://www.npmjs.com/package/flatted

// ESM
import {parse, stringify, toJSON, fromJSON} from 'flatted';

// CJS
const {parse, stringify, toJSON, fromJSON} = require('flatted');

const a = [{}];
a[0].a = a;
a.push(a);

stringify(a); // [["1","0"],{"a":"0"}]

Lösung 2: (ebenfalls von MDN)

https://github.com/douglascrockford/JSON-js

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