TypeError: Converting circular structure to JSON - find error in json

TypeError: Converting circular structure to JSON - find error in json

我正在使用带有 MEAN 堆栈的 Contentful。我查询 Contentful API 并取回 json 对象。

contentClient.entries(query, function(err, entries){
  if (err) throw err;
  console.log(entries);
});

我刚刚收到以下错误:

[TypeError: Converting circular structure to JSON]

对象很大(当我将它从控制台导出到文档时超过 3000 行)。所以我不能在这里post,但我想知道是否有办法找到对象内循环结构问题的位置以及我如何补救这个问题?

在节点0.10和0.12中,你可以这样做:

var obj = {"child": {}};
obj.obj = obj;
util.inspect(obj, {depth: null})

你会得到类似的东西:

'{ child: {}, obj: [Circular] }'

深度表示格式化对象时递归的次数(默认为2),null表示无限期。

要查找循环引用在哪里,很容易在结果字符串中查找“[Circular]”。

我是 Contentful 的一名开发人员,我想我可以帮助解决您问题的第二部分。

至于第一部分,如果您在节点领域,greuze 的回答是最理想的选择。另一种方法(在浏览器中也有帮助)是使用 https://www.npmjs.com/package/safe-json-stringify

至于第二部分,contentful.js 库所做的一件事是将 link 解析为其他条目。原始 JSON 仅包含一个包含 link 元数据的对象,但 linked 条目包含在附件中 属性。然后图书馆会去解决这些问题,这样您就不必自己动手了。

但是,我们确实允许您在 link 彼此输入条目时创建循环 links(您甚至可以 link 自己的条目!)并且现在我们还没有实现一种好的方法来检测并在 CMS 中呈现这些内容(尽管这是我提出的一个很好的功能想法)。

因此,一旦您找到该循环引用,那应该是您的根本问题。

我不确定这是否是一个高效的解决方案,但它确实有效。只有当我们使用 Next.js 在服务器端呈现内容时,我们才会遇到此问题。

我们有一个文章模型,它需要最终被链接的相关文章,所以这种情况经常出现。

这是我解决问题的方法:

let article = await contentful.getArticle({
  'fields.slug': query.slug,
  include: 2,
})

const circularRef = _.get(article, 'items[0].fields.relatedArticle.fields.relatedArticle')

if (circularRef) {
  delete article.items[0].fields.relatedArticle.fields.relatedArticle
}

请注意,getArticle 是我创建的辅助方法,get 来自 lodash 库。希望有所帮助。