【问题标题】:Why does an infinite recursion error appear while processing JSON.stringify为什么在处理 JSON.stringify 时会出现无限递归错误
【发布时间】:2020-03-21 01:28:31
【问题描述】:
function repErr(key, value) {
  let error = {};
  Object.getOwnPropertyNames(value).forEach(function (key) {
      error[key] = value[key];
  });
  return error;
}

当我调用 JSON.stringify(err, repErr) 时,我在控制台中看到错误太多递归。
我有 firefox 68,我在每次迭代时都调用了调试器,我看到在第四遍时它开始向对象添加类似这样的东西:

{
  0: 'h',
  1: 't',
  2: 't',
  3: 'p',
  // and etc
}

是什么原因,可以解决吗?

【问题讨论】:

  • 鉴于您发布的代码中没有任何地方调用JSON.stringify(),因此无法说。并非所有对象结构都可以序列化为 JSON。

标签: javascript recursion stringify getproperty getproperties


【解决方案1】:

对象很可能包含循环,其中树中的一个对象引用另一个对象,该对象最终引用第一个对象。我发现这个问题经常出现在 axios 之类的错误中,因为响​​应对象引用了请求对象,而请求对象引用了响应对象。

这是一个经常困扰我们的恼人问题。值得庆幸的是,有像 json-decycle 这样的库和其他库通过将循环引用更改为可以在没有堆栈溢出的情况下进行序列化的东西来解决这个问题。

【讨论】:

  • 即需要检查对象吗?
  • 不,与此无关;问题是,如果您正在浏览属性,并且某些属性指的是之前已经遇到的东西,那么您将无限循环。例如,想象一下尝试序列化对象const a = { name: 'a' }; const b = { name: 'b', parent: a }; a.child = b;。序列化程序将通过模式{ "name": "a", "child": { "name": "b", "parent": { "name": "a", "child": { "name": "b", "parent"... 等等而不会终止,直到内存不足或堆栈溢出。
  • 请注意,还存在其他序列化陷阱,例如序列化巨大的缓冲区、证书链等。基本上,长话短说,序列化任何形状未知的对象通常是个坏主意。我看到这个问题尤其是带有大量细节的错误对象,比如 HTTP 请求和响应对象。
  • 现在很清楚了,我找到了手动获取必要参数的解决方案。谢谢
猜你喜欢
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 2021-06-11
  • 2021-08-30
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多