如何解决 NodeJS 中的“TypeError:将循环结构转换为 JSON”

Posted

技术标签:

【中文标题】如何解决 NodeJS 中的“TypeError:将循环结构转换为 JSON”【英文标题】:How do I solve "TypeError: Converting circular structure to JSON" in NodeJS 【发布时间】:2020-02-03 23:40:11 【问题描述】:

我正在使用 React。为了从我的 mysql 数据库中查询一些数据,我创建了另一个 NodeJS 后端服务器并编写了这段代码。

  var con = mysql.createConnection(
    host: "localhost",
    port: "3306",
    database: "my_books",
    user: "root",
    password: "pokemon2345"
  );
  con.connect();

  var sql = JSON.parse(req.query.msg);
  console.log(sql);
  var answer = con.query(sql);
  con.end();
  res.send(JSON.stringify(answer));

这是我在 React 主应用程序中的代码。

    var request = new XMLHttpRequest();
    var jsql = JSON.stringify(sql);
    request.onreadystatechange = function() 
      debugger;
      if (this.readyState == 4 && this.status == 200) 
        var response = this.responseText;
        toast.success(typeof response);
      
    ;
    request.open(
      "GET",
      "http://localhost:3001/retrieve_books" + "?msg=" + jsql,
      true
    );
    request.send(jsql);

我无法弄清楚为什么会发生这个错误以及我的代码是如何循环的? 提前致谢!

【问题讨论】:

代码不是循环的,数据是 注意,在我曾经使用过的每个 nodejs mysql 库中,.query 是异步的,要么返回一个承诺,要么接受一个回调——你的代码看起来像你期望的 同步 结果 【参考方案1】:

同意 Dhananjai 的回答。我过去曾多次偶然发现这个问题。我创建了一个npm package 来解决这个问题并安全地对对象进行字符串化。

【讨论】:

【参考方案2】:

循环 JSON 的意思是,对象内部有一个对象的引用,这使得 JSON.stringify 不可能。

在您的情况下, res.send(JSON.stringify(answer)) 可能是问题所在。 con.query(sql) 的响应可能不是一个简单的对象。

另外,该函数是异步的,需要回调来得到答案(我假设你使用的是 mysqljs https://github.com/mysqljs/mysql)

给出更多细节以进一步解释,但根本问题是变量“answer”的值

【讨论】:

很高兴它有帮助! :)

以上是关于如何解决 NodeJS 中的“TypeError:将循环结构转换为 JSON”的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs报内部错误 TypeError: Cannot read property ‘destroy‘ of undefined的解决方法

TypeError:Task.find 不是 Node Js 中的函数

如何解决 TypeError: request.write is not a function

NodeJS Mongoose record.save TypeError

TypeError [ERR_INVALID_ARG_TYPE] 尝试将错误写入 Nodejs 中的文件时

TypeError:尝试获取资源时出现 NetworkError。从nodejs服务器获取数据时得到这个[重复]