JSON循环结构转换错误排查及非解构赋值实现咨询
解决"Converting circular structure to JSON"错误
错误原因
你这段代码的核心问题是循环引用:
data是req.payload['profileData']的引用,二者指向同一个对象- 你给
data添加history属性后,又把data本身放进了history.previousData数组里 - 这就形成了闭环:
data → history.previousData[0] → data,JSON序列化(包括JSON.stringify和数据库存储时的序列化)无法处理这种自引用结构,因此触发错误。
修复方法
解决关键是给previousData传入原对象的拷贝,而非原对象的引用,断开循环链。常用方案如下:
1. 深拷贝(适配嵌套对象)
如果原profileData有嵌套属性,用JSON.parse(JSON.stringify(data))快速生成深拷贝:
const data = req.payload['profileData']; // 生成原数据的深拷贝 const dataCopy = JSON.parse(JSON.stringify(data)); data.history = { lastUpdated: [currenttimestamp], previousData: [dataCopy] };
或者用ES2022原生的structuredClone,它能更好处理Date、Map等特殊类型:
const data = req.payload['profileData']; const dataCopy = structuredClone(data); data.history = { lastUpdated: [currenttimestamp], previousData: [dataCopy] };
2. 浅拷贝(仅适用于单层属性对象)
如果原profileData都是单层属性,用展开运算符或Object.assign即可:
const data = req.payload['profileData']; const dataCopy = {...data}; // 等价于 Object.assign({}, data) data.history = { lastUpdated: [currenttimestamp], previousData: [dataCopy] };
关于“不通过解构直接赋值”
不行。不管用不用解构,直接把data赋值给previousData都是存储原对象的引用,必然会形成循环引用。必须生成一个新的对象(拷贝),才能避免这个问题。
内容的提问来源于stack exchange,提问作者SunAns
相关产品推荐
相关产品推荐

