我正在使用带有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行)。所以我不能在这里发布,但我想知道是否有办法找到对象中的循环结构问题以及我如何解决这个问题?
答案 0 :(得分:4)
我是Contentful的开发人员,我想我可以帮助解决您问题的第二部分。
至于第一部分,如果你在节点的土地上,那么greuze的答案是理想的选择。另一种选择(在浏览器中也有帮助)是使用https://www.npmjs.com/package/safe-json-stringify
至于第二部分,contentful.js库所做的是解析到其他条目的链接。原始JSON仅包含具有链接元数据的对象,但链接的条目包含在附加的包含属性中。然后图书馆会解决这些问题,因此您不必自己动手。
但是,我们允许您在将条目链接到彼此时创建循环链接(您甚至可以将条目链接到自身!)而且现在我们还没有实现检测和呈现条目的好方法CMS(虽然这是我提出的一个很好的功能概念)。
因此,一旦找到循环引用,那应该是您的根本问题。
答案 1 :(得分:1)
在节点0.10和0.12中,您可以执行以下操作:
var obj = {"child": {}};
obj.obj = obj;
util.inspect(obj, {depth: null})
你会得到类似的东西:
'{ child: {}, obj: [Circular] }'
深度表示格式化对象时递归的次数(默认为2),null表示无限期。
要找到循环引用的位置,很容易找到" [循环]"在结果字符串中。
答案 2 :(得分: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库。希望能有所帮助。