TypeError:在nodejs中将循环结构转换为JSON

时间:2014-11-24 09:11:27

标签: javascript json node.js

我正在使用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:将循环结构转换为JSON

有谁能告诉我这是什么问题

由于

12 个答案:

答案 0 :(得分:18)

JSON不接受圆形对象 - 引用自身的对象。如果遇到其中一个,JSON.stringify()会抛出错误。

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

在这种情况下,因为您只需将其记录到控制台,就可以使用控制台的本地字符串化并避免使用JSON:

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

答案 1 :(得分:3)

尝试使用此npm软件包。这有助于我在使用passport-azure-ad通过Microsoft帐户集成登录信息的同时,从节点解码res结构。

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

您可以执行以下操作来对圆形结构进行分类:

const str = CircularJSON.stringify(obj);

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

JSON.parse(str)

答案 2 :(得分:1)

使用此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)

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

我忘记在异步函数中使用 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 关键字一起使用。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

当不对异步函数(API调用)使用异步/等待时,遇到了这个问题。因此,添加它们/使用promise处理程序可以正确清除错误。

答案 7 :(得分:0)

使用JSON.stringify()解决了该问题。 如果要解析数据。您可以使用JSON.parse(JSON.stringify(res.data))

示例:

async uploadimage(ctx) {
 const response = await axios.post("<URL>",<BODY_DATA>);

 ctx.body = {
   status: "success",
   data: {
     image: JSON.parse(JSON.stringify(response.data)),
   },
 }
}

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

这是因为包含循环引用的 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 :(得分:-3)

也试试这个

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