我有以下......
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;
但是,我的代码永远不会达到"ZOMG HERE"而是在运行 chrome.extension.sendRequest
时抛出以下错误
Uncaught TypeError: Converting circular structure to JSON
chromeHidden.JSON.stringify
chrome.Port.postMessage
chrome.initExtension.chrome.extension.sendRequest
suggestQuery
有谁知道是什么原因引起的?
9 回答
这意味着您在请求中传递的对象(我猜它是
pagedoc
)有一个循环引用,如:JSON.stringify
无法转换此类结构 .N.B. :DOM节点就是这种情况,它们具有循环引用,即使它们没有附加到DOM树 . 在大多数情况下,每个节点都有一个
ownerDocument
,它指的是document
.document
至少通过document.body
引用DOM树,document.body.ownerDocument
再次引用document
,这只是DOM树中多个循环引用之一 .根据the JSON docs at Mozilla,
JSON.Stringify
有第二个参数censor
,可用于在解析树时过滤/忽略子项 . 但是,也许你可以避免循环引用 .在Node.js中我们不能 . 所以我们可以这样做:
结果:
不幸的是,在它自动假设为循环之前,似乎最多有30次迭代 . 否则,这应该工作 . 我甚至使用
areEquivalent
from here,但JSON.Stringify
仍然在30次迭代后抛出异常 . 它仍然是's good enough to get a decent representation of the object at a top level, if you really need it. Perhaps somebody can improve upon this though? In Node.js for an HTTP request object, I'得到:我在这里创建了一个小的Node.js模块:https://github.com/ericmuyser/stringy随意改进/贡献!
一种方法是从主对象中剥离对象和函数 . 并将更简单的形式字符串化
我通常使用circular-json npm包来解决这个问题 .
https://www.npmjs.com/package/circular-json
这可能不是相关的答案,但是这个链接Detecting and fixing circular references in JavaScript可能有助于检测导致循环依赖的 objects .
我在NodeJS上解决了这个问题,如下所示:
尝试使用jQuery构建下面的消息时,我遇到了同样的错误 .
reviewerName
被错误地分配给msg.detail.reviewerName
时发生循环引用 . JQuery的.val()修复了这个问题,请参阅最后一行 .基于zainengineer的答案......另一种方法是制作对象的深层副本并剥离循环引用并对结果进行字符串化 .
我在使用jQuery formvaliadator时遇到了同样的错误,但是当我在success:function中删除了一个console.log时,它运行起来了 .