3

我将 Contentful 与 MEAN 堆栈一起使用。我查询 Contentful API 并取回一个 json 对象。

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

我刚刚收到以下错误:

[TypeError: Converting circular structure to JSON]

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

4

3 回答 3

5

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

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

至于第二部分,contentful.js 库所做的一件事是解析指向其他条目的链接。原始 JSON 仅包含一个带有链接元数据的对象,但链接条目包含在附加的 include 属性中。然后图书馆去解决这些问题,所以你不必自己做。

但是,我们确实允许您在将条目相互链接时创建循环链接(您甚至可以将条目链接到自身!),现在我们还没有实现在 CMS 中检测和呈现这些的好方法(尽管这是我会提出一个很好的功能想法)。

因此,一旦您确实找到了该循环参考,那应该是您的根本问题。

于 2015-05-14T15:48:50.897 回答
1

在节点 0.10 和 0.12 中,您可以执行以下操作:

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

你会得到类似的东西:

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

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

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

于 2015-05-14T13:24:54.407 回答
0

我不确定这是否是一个高性能的解决方案,但它确实有效。只有当我们使用 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 库。希望有帮助。

于 2019-06-17T20:33:21.787 回答