循环引用异常 TypeError: Converting circular structure to JSON

2023-12-06 12:04:17

浏览:48

评论:0

在维护前员工的项目时,发现有个提交发送请求失败,遂逐步排查,发现 axios 拦截器抛出异常信息 TypeError: Converting circular structure to JSON,发现是循环引用异常。

排查解决

在axios中,请求参数params如果是对象的话,axios会使用URLSearchParams去转换成字符串。

// 创建一个示例对象
function transition(params) {
  // 创建 URLSearchParams 对象
  const searchParams = new URLSearchParams();
  
  // 将对象的键值对添加到 searchParams 对象中
  for (const key in params) {
    if (params.hasOwnProperty(key)) {
      searchParams.set(key, params[key]);
    }
  }
  
  // 获取转换后的参数字符串
  const paramsString = searchParams.toString();
  console.log(paramsString); 
}

// 定义参数对象
const newParams = {
  page: 1,
  limit: 10,
};

// 正常数据
transition(newParams);

// 循环引用没有抛出异常
newParams.v = newParams;
transition(newParams);

在axios中,请求参数data如果是对象的话,axios会使用JSON.stringify去转换成字符串。

// 创建一个示例对象
function transition(data) {  
  // 获取转换后的参数字符串
  const dataString = JSON.stringify(data);
  console.log(dataString); 
}

// 定义参数对象
const newData = {
  page: 1,
  limit: 10,
};

// 正常数据
transition(newData);

// 循环引用有抛出异常
newData.v = newData;
transition(newData);

综合上述得出数据对象出错在data参数中。

什么是循环引用异常

循环引用异常(Cycle Reference Exception)是在编程中出现的一种错误情况,特别是在使用引用类型(如对象、类等)时。当两个或多个对象之间存在循环引用关系,即 A 对象引用 B 对象,B 对象又引用 A 对象,形成一个循环,就会导致循环引用异常。 这种循环引用会创建一个无限循环的引用链,使得对象的内存无法正常释放,从而可能导致内存泄漏和其他问题。在某些编程语言中,循环引用异常会导致程序崩溃或出现其他不可预测的行为。