【问题标题】:TypeError: Converting circular structure to JSON in nodejsTypeError:在nodejs中将循环结构转换为JSON
【发布时间】:2015-01-21 22:52:12
【问题描述】:

我正在使用 nodejs 的请求包

我在这里使用这个代码

 var formData = ({first_name:firstname,last_name:lastname,user_name:username, email:email,password:password});

  request.post({url:'http://localhost:8081/register', JSON: formData}, function(err, connection, body) {

exports.Register = function(req, res) {
    res.header("Access-Control-Allow-Origin", "*");
    console.log("Request data " +JSON.stringify(req));

我收到了这个错误 TypeError: Converting circular structure to JSON

谁能告诉我是什么问题

谢谢

【问题讨论】:

标签: javascript json node.js


【解决方案1】:

JSON 不接受循环对象——引用自身的对象。 JSON.stringify() 遇到其中一个会抛出错误。

请求 (req) 对象本质上是循环的 - Node 就是这样做的。

这种情况下,因为只需要记录到控制台,所以可以使用控制台原生的字符串化,避免使用JSON:

console.log("Request data:");
console.log(req);

【讨论】:

  • 我想提取 req 对象中存在的令牌,那么有没有办法在不使用以下答案中提到的外部库的情况下提取它或将 req 对象转换为 json。
  • @Rahulroy 你应该能够从 req 对象访问你需要的属性
  • 好吧,这是我拥有pastebin.com/i1yyaUaB 的 req 对象,我正在尝试访问 session.keycloak-token 中的 access_token 字段。我怎样才能访问它。感谢您的帮助。
  • 你需要 JSON.parse() 它
  • 试过了,但这也带来了自己的新问题。给定数据丢失。
【解决方案2】:

尝试使用这个 npm 包。这有助于我从我的节点解码 res 结构,同时使用 passport-azure-ad 集成使用 Microsoft 帐户的登录

https://www.npmjs.com/package/circular-json

您可以通过以下方式对循环结构进行字符串化:

const str = CircularJSON.stringify(obj);

然后您可以使用 JSON 解析器将其转换为 JSON

JSON.parse(str)

【讨论】:

【解决方案3】:

TypeError: Converting circular structure to JSON in nodejs: 将 Arangodb 与 Node.js 一起使用时,可以在 Arangodb 上看到此错误,因为您的数据库中缺少存储空间。如果存档是在您的数据库下创建的,请在 Aurangobi Web 界面中查看。

【讨论】:

    【解决方案4】:

    我也遇到了这个问题。那是因为我忘了等待一个承诺。

    【讨论】:

    • 谢谢,伙计。绝对为我工作。如果有人解释 async-await 如何解决这个问题会更好。谢谢!
    【解决方案5】:

    使用这个https://www.npmjs.com/package/json-stringify-safe

    var stringify = require('json-stringify-safe');
    var circularObj = {};
    circularObj.circularRef = circularObj;
    circularObj.list = [ circularObj, circularObj ];
    console.log(stringify(circularObj, null, 2));
    
    
    stringify(obj, serializer, indent, decycler)
    

    【讨论】:

    • 我该如何解析这个?
    【解决方案6】:

    我在异步函数(api 调用)上不使用 async/await 时遇到了这个问题。因此添加它们/使用承诺处理程序正确地清除了错误。

    【讨论】:

      【解决方案7】:

      当我错过在调用返回 Promise 之前的 async 方法中使用 await 关键字时,在我的 Node Api 调用中遇到了这个问题。我通过添加 await 关键字解决了它。

      【讨论】:

        【解决方案8】:

        这是因为你没有异步响应例如:

        app.get(`${api}/users`, async (req, res) => {
            const users = await User.find()
            res.send(users);
           })
        

        【讨论】:

        • 似乎是 JSON.stringify 调用是问题所在,所以 console.log 行
        • 请编辑以提供解释句中缺少的单词。
        【解决方案9】:

        如果您要发送回复,请在回复前使用await

        await res.json({data: req.data});
        

        【讨论】:

          【解决方案10】:

          这是因为 包含循环引用的 JavaScript 结构无法使用“普通”JSON.stringify 进行序列化

          @Dinesh 提到的https://www.npmjs.com/package/circular-json 是一个很好的解决方案。但是这个 npm 包已经被弃用了。

          所以直接使用来自 CircularJSON 的创建者的https://www.npmjs.com/package/flatted npm 包。

          简单的用法。在你的情况下,代码如下

          导入包

          // ESM
          import {parse, stringify} from 'flatted';
          
          // CJS
          const {parse, stringify} = require('flatted');
          

          console.log("Request data " + stringify(req));
          

          【讨论】:

            【解决方案11】:

            我忘记在异步函数中使用 await 关键字。 使用给定的系统税

            blogRouter.put('/:id', async (request, response) => {
              const updatedBlog = Blog.findByIdAndUpdate(
                request.params.id,
                request.body,
                { new: true }
              );
              response.status(201).json(updatedBlog);
            });
            

            Blog.findByIdAndUpdate 应与 await 关键字一起使用。

            【讨论】:

              【解决方案12】:

              也试试这个

              console.log(JSON.parse(JSON.stringify(req.body)));
              

              【讨论】:

              • JSON.parse(JSON.stringify()) - 这段代码 sn-p 有什么意义?!
              • 恐怕这可能是一个可行的解决方法。
              【解决方案13】:

              我能够使用这种方法获取值,在careerkarma.com 找到

              输出看起来像这样。

              我只是在调试器控制台中运行此代码。将您的对象传递给此函数。
              也可以复制粘贴函数。

               const replacerFunc = () => {
                  const visited = new WeakSet();
                  return (key, value) => {
                    if (typeof value === "object" && value !== null) {
                      if (visited.has(value)) {
                        return;
                      }
                      visited.add(value);
                    }
                    return value;
                  };
                };
                
                JSON.stringify(circObj, replacerFunc());
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2022-01-11
                • 1970-01-01
                • 2018-10-05
                • 2016-01-22
                • 2017-06-29
                • 2019-01-05
                • 1970-01-01
                相关资源
                最近更新 更多