ক্রোম প্রেরণের ত্রুটি: প্রকারের ত্রুটি: বিজ্ঞপ্তি কাঠামোটিকে JSON এ রূপান্তর করা


382

আমি নিম্নলিখিত পেয়েছি ...

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

যা নিম্নলিখিতগুলি কল করে ..

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

যাইহোক, আমার কোডটি কখনই "জুমগ হেরে" পৌঁছায় না বরং চলার সময় নিম্নলিখিত ত্রুটিটি ছুঁড়ে দেয় chrome.extension.sendRequest

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

কারও কি ধারণা আছে যে এটি কী কারণে ঘটছে?


2
আপনি এমন একটি বস্তু প্রেরণের চেষ্টা করছেন যাতে এতে বিজ্ঞপ্তি সংক্রান্ত রেফারেন্স রয়েছে। কী pagedoc?
ফেলিক্স ক্লিং

9
আমি কী বলতে চাই? 1. এর মান কত pagedoc? ২. সার্কুলার রেফারেন্স:a = {}; a.b = a;
ফেলিক্স ক্লিং ২

1
আহ .. এটা স্থির! যদি আপনি এটি একটি উত্তর দিতে চান তবে আমি আপনাকে এটির জন্য ক্রেডিট দেব!
স্কাইজিট

5
node.js: Use.inspect
boldnik

উত্তর:


488

এর অর্থ হল যে আপনি যে অনুরোধটি অনুরোধে পাস করবেন (আমার ধারণা এটি হ'ল pagedoc) একটি বিজ্ঞপ্তি রেফারেন্স রয়েছে, এরকম কিছু:

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

JSON.stringify এর মতো কাঠামো রূপান্তর করতে পারে না।

এনবি : এটি ডিওএম নোডের ক্ষেত্রে ঘটবে, যার সাথে বিজ্ঞপ্তি সংক্রান্ত রেফারেন্স রয়েছে, যদিও তারা ডিওএম গাছের সাথে সংযুক্ত না থাকে। প্রতিটি নোডে একটি থাকে ownerDocumentযা documentবেশিরভাগ ক্ষেত্রে বোঝায় । documentমাধ্যমে অন্তত DOM গাছ একটি রেফারেন্স রয়েছে document.bodyএবং document.body.ownerDocumentফিরে বোঝায় documentআবার, যা শুধুমাত্র হয় এক DOM গাছ একাধিক বৃত্তাকার রেফারেন্সের।


2
ধন্যবাদ! এটি আমি পেয়েছি বিষয়টি ব্যাখ্যা করে। তবে কীভাবে DOM অবজেক্টে উপস্থিত বিজ্ঞপ্তিটি কোনও সমস্যা সৃষ্টি করে না? JSON একটি documentবস্তুর স্ট্রিংফাই করবে ?
জিজ্ঞাসা করুন

3
@ এসএসজিএস: এটি কমপক্ষে ক্রোমের ক্ষেত্রে সমস্যা সৃষ্টি করে । ফায়ারফক্স এটিকে কিছুটা স্মার্ট বলে মনে হচ্ছে, তবে আমি ঠিক জানি না এটি কী করছে।
ফেলিক্স ক্লিং

এই ত্রুটিটি "ধরা" এবং পরিচালনা করা কি সম্ভব?
ডগ মোলিনাক্স

2
@ ডগমোলিনাক্স: অবশ্যই, আপনি try...catchএই ত্রুটিটি ধরতে ব্যবহার করতে পারেন ।
ফেলিক্স ক্লিং

4
@ ফেলিক্সক্লিং দুর্ভাগ্যক্রমে আমি এটি কাজ করতে পারি না (সম্ভবত কিছু ভুল করছিল) আমি এটি ব্যবহার করে শেষ করেছি: github.com/isaacs/json-stringify-safe
ডগ

128

অনুযায়ী মোজিলার তাদেরকে JSON ডক্স , JSON.Stringifyএকটি দ্বিতীয় প্যারামিটার রয়েছে censorযা / ফিল্টার ব্যবহার করা যেতে পারে শিশু আইটেম উপেক্ষা যখন গাছ পার্স। তবে, সম্ভবত আপনি বিজ্ঞপ্তি উল্লেখ এড়াতে পারেন।

নোড.জেজে আমরা পারি না। সুতরাং আমরা এর মতো কিছু করতে পারি:

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)));

ফলাফল:

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

দুর্ভাগ্যক্রমে এটি স্বয়ংক্রিয়ভাবে বিজ্ঞপ্তিটি ধরে নেওয়ার আগে সর্বোচ্চ 30 টি পুনরাবৃত্তি বলে মনে হচ্ছে। অন্যথায়, এটি কাজ করা উচিত। আমি এমনকি areEquivalent এখান থেকে ব্যবহার করেছি , তবে JSON.Stringify30 টি পুনরাবৃত্তির পরেও ব্যতিক্রম ছুঁড়েছি। তবুও, যদি আপনার সত্যিই এটির প্রয়োজন হয় তবে এটি শীর্ষ স্তরে অবজেক্টের একটি ভাল প্রতিনিধিত্ব পাওয়ার পক্ষে যথেষ্ট। সম্ভবত কেউ এই উন্নতি করতে পারেন যদিও? কোনও HTTP অনুরোধের জন্য নোড.জেজে, আমি পাচ্ছি:

{
"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]"
}

এটি করার জন্য আমি একটি ছোট নোড.জেএস মডিউল তৈরি করেছি: https://github.com/ericmuyser/stringy উন্নত / অবদান রাখতে নির্দ্বিধায়!


10
আমি প্রথমবার কোনও ফাংশনটি পাস হতে দেখি যা একটি স্ব-সম্পাদনকারী ফাংশন দেয় যা একটি নিয়মিত ফাংশন দেয়। আমি বিশ্বাস করি যে আমি কেন এটি করা হয়েছিল তা বুঝতে পেরেছি, তবে আমি বিশ্বাস করি না যে আমি নিজেই এই সমাধানটি পেয়েছি এবং আমি মনে করি যে এই সেটআপটির প্রয়োজন আছে এমন অন্যান্য উদাহরণগুলি যদি আমি দেখতে পেতাম তবে আমি এই কৌশলটি আরও ভালভাবে স্মরণ করতে পারতাম । বলা হচ্ছে, আপনি কি এই সেটআপ / কৌশল (কোনও ভাল শব্দটির অভাবে) বা অনুরূপ কোনও সম্পর্কিত সাহিত্যের প্রতি ইঙ্গিত করতে পারেন ?
শান

1
শনকে +1 দয়া করে সেই আইএফইটি সরিয়ে দিন, এটি একেবারে অকেজো এবং অযোগ্য।
বার্গি

1
সেন্সর আরগটি নির্দেশ করার জন্য THX! এটি বিজ্ঞপ্তি সংক্রান্ত সমস্যাগুলি ডিবাগ করার অনুমতি দেয়। আমার ক্ষেত্রে আমার কাছে একটি jquery অ্যারে ছিল যেখানে আমি স্বাভাবিক অ্যারে রাখতে চাই। তারা উভয়ই ডিবাগ প্রিন্ট মোডে একই রকম দেখাচ্ছে। আইইএফই সম্পর্কে, আমি তাদের প্রায়শই এমন জায়গায় ব্যবহার করতে দেখি যেখানে তাদের জন্য একেবারেই কোনও প্রয়োজন নেই এবং শন এবং বার্গির সাথে একমত হয় যে এটি ঠিক এটিই।
সিটিকিড

1
আমি নিশ্চিত না কেন, তবে এই সমাধানটি আমার পক্ষে কার্যকর হবে বলে মনে হয় না।
নিকোলা শোউ

1
@ ব্রুনোএলএম: ৩০ টি পুনরাবৃত্তি সীমাতে, আপনি ফিরে আসলে '[Unknown:' + typeof(value) + ']'আপনি কীভাবে সেন্সরকে সঠিকভাবে ফাংশন এবং কিছু অন্যান্য ধরণের চিকিত্সার জন্য ঠিক করবেন তা দেখতে পাবেন।
অ্যালেক্স পাক্কা

46

একটি পদ্ধতির প্রধান অবজেক্ট থেকে অবজেক্ট এবং ফাংশন ফেলা হয়। এবং আরও সহজ ফর্মটি রূপান্তরিত করুন

function simpleStringify (object){
    var simpleObject = {};
    for (var prop in object ){
        if (!object.hasOwnProperty(prop)){
            continue;
        }
        if (typeof(object[prop]) == 'object'){
            continue;
        }
        if (typeof(object[prop]) == 'function'){
            continue;
        }
        simpleObject[prop] = object[prop];
    }
    return JSON.stringify(simpleObject); // returns cleaned up JSON
};

2
আমার জন্য নিখুঁত উত্তর। 'ফাংশন' কীওয়ার্ড মিস হয়েছে?
স্টেপান লগইনভ

28

এটি সমাধান করার জন্য আমি সাধারণত বিজ্ঞপ্তি-জসন এনপিএম প্যাকেজটি ব্যবহার করি।

// Felix Kling's example
var a = {};
a.b = a;
// load circular-json module
var CircularJSON = require('circular-json');
console.log(CircularJSON.stringify(a));
//result
{"b":"~"}

দ্রষ্টব্য: বিজ্ঞপ্তি-জসনকে অবহেলা করা হয়েছে, আমি এখন ফ্ল্যাটেড ব্যবহার করি (সার্কুলার জেএসএন এর স্রষ্টার কাছ থেকে):

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

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

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

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

থেকে: https://www.npmjs.com/package/flatted


8

জাইনেনিজেনারের উত্তরের উপর ভিত্তি করে ... আরেকটি পদ্ধতি হ'ল বস্তুর গভীর অনুলিপি তৈরি করা এবং বিজ্ঞপ্তি সংক্রান্ত রেফারেন্সগুলি স্ট্রিপ করা এবং ফলাফলটিকে আরও শক্তিশালী করা।

function cleanStringify(object) {
    if (object && typeof object === 'object') {
        object = copyWithoutCircularReferences([object], object);
    }
    return JSON.stringify(object);

    function copyWithoutCircularReferences(references, object) {
        var cleanObject = {};
        Object.keys(object).forEach(function(key) {
            var value = object[key];
            if (value && typeof value === 'object') {
                if (references.indexOf(value) < 0) {
                    references.push(value);
                    cleanObject[key] = copyWithoutCircularReferences(references, value);
                    references.pop();
                } else {
                    cleanObject[key] = '###_Circular_###';
                }
            } else if (typeof value !== 'function') {
                cleanObject[key] = value;
            }
        });
        return cleanObject;
    }
}

// Example

var a = {
    name: "a"
};

var b = {
    name: "b"
};

b.a = a;
a.b = b;

console.log(cleanStringify(a));
console.log(cleanStringify(b));


6

এটি সম্পর্কিত উত্তর নাও হতে পারে তবে এই লিঙ্কটি জাভাস্ক্রিপ্টে বিজ্ঞপ্তি রেফারেন্সগুলি সনাক্তকরণ এবং ফিক্সিংটি এমন বস্তুগুলি সনাক্ত করতে সহায়তা করতে পারে যা বৃত্তাকার নির্ভরতা সৃষ্টি করে।


4

আমি নোডজেএস-এ এই সমস্যাটি সমাধান করি:

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));

2

নীচে বার্তাটি jQuery দিয়ে তৈরি করার চেষ্টা করার সময় আমি একই ত্রুটিটি পেয়েছি। বিজ্ঞপ্তি রেফারেন্সটি ঘটে যখন reviewerNameভুলভাবে অর্পণ করা হচ্ছিল msg.detail.reviewerName। JQuery এর .val () সমস্যাটি স্থির করেছে, শেষ লাইনটি দেখুন।

var reviewerName = $('reviewerName'); // <input type="text" id="taskName" />;
var msg = {"type":"A", "detail":{"managerReview":true} };
msg.detail.reviewerName = reviewerName; // Error
msg.detail.reviewerName = reviewerName.val(); // Fixed

1

আমি jQuery formvaliadator এর সাথে একই ত্রুটি পেয়েছিলাম, কিন্তু যখন আমি সাফল্যের ভিতরে একটি কনসোল.লগ সরিয়েছি: ফাংশন, এটি কাজ করেছিল।


0

আমার ক্ষেত্রে আমি ত্রুটিটি পাচ্ছিলাম যখন আমি asyncআমার সার্ভার-সাইডে ফাংশনটি মঙ্গুজ ব্যবহার করে দস্তাবেজ আনতে ব্যবহার করছিলাম। এটি প্রমাণিত হয়েছিল যে কারণটি আমি awaitকল করার find({})পদ্ধতির আগে রাখা ভুলে গিয়েছিলাম । অংশটি যুক্ত করা আমার সমস্যাটি স্থির করে।


0

এটি কাজ করে এবং আপনাকে জানায় যে কোন বৈশিষ্ট্যগুলি বিজ্ঞপ্তিযুক্ত। এটি রেফারেন্স সহ অবজেক্টটি পুনর্গঠন করার অনুমতি দেয়

  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();
      }
    }
  })();

প্রচুর গোলমাল মুছে ফেলার উদাহরণ:

{
    "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"
    }
}

পুনর্গঠন কল JSON.parse () তারপর বৈশিষ্ট্য খুঁজছেন মাধ্যেমে লুপ করতে [Circular Reference]ট্যাগ। তারপর কেটে বন্ধ এবং ... Eval ... এটা thisরুট বস্তু সেট।

হ্যাক করা যায় এমন কোনও কিছু প্রকাশ করবেন না। আরও ভাল অনুশীলন হ'ল string.split('.')নাম উল্লেখ করে রেফারেন্স সেট করতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.