You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:35:37