112

I am using request package for node.js

Code :

 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));

Here I am getting this error :

TypeError: Converting circular structure to JSON

Can anybody tell me what is the problem

4

20 Answers 20

112

JSON doesn't accept circular objects - objects which reference themselves. JSON.stringify() will throw an error if it comes across one of these.

The request (req) object is circular by nature - Node does that.

In this case, because you just need to log it to the console, you can use the console's native stringifying and avoid using JSON:

console.log("Request data:");
console.log(req);
Sign up to request clarification or add additional context in comments.

7 Comments

I want to extract a token present in req object, so is there a way to extract this or convert the req object to json without using the external library mentioned in the below answer.
@Rahulroy you should be able to just access the property you need from the req object
well i this is the req object that i have pastebin.com/i1yyaUaB and i am trying to access access_token field in session.keycloak-token. How can i access that. Thanks for the help.
You'll need to JSON.parse() it
tried that, but that also comes up with new problem of its own. given data loss.
|
108

I also ran into this issue. It was because I forgot to await for a promise.

Comments

20

I was able to get the values using this method, found at careerkarma.com

Output looks like this. Preview of the output

I just run this code in the debugger console. Pass your object to this function.
Copy paste the function also.

 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());

Comments

13

Try using this npm package. This helped me decoding the res structure from my node while using passport-azure-ad for integrating login using Microsoft account

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

You can stringify your circular structure by doing:

const str = CircularJSON.stringify(obj);

then you can convert it onto JSON using JSON parser

JSON.parse(str)

2 Comments

CircularJSON has now been deprecated
As their page says, I guess we can use github.com/WebReflection/flatted#flatted flatted from now
8

I forgotten to use await keyword in async function. with the given systax

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

Blog.findByIdAndUpdate should be used with the await keyword.

Comments

6

use this 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)

1 Comment

how do I parse this?
6

If you are sending reponse , Just use await before response

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

Comments

4

It's because you don't an async response For example:

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

3 Comments

It seems like it is the JSON.stringify call that is the problem and so the console.log line
Please edit to supply the missing word in your explanatory sentence.
I was also facing a similar issue, because of not using await before calling response.send()
4

I was also getting the same error, in my case it was just because of not using await with Users.findById() which returns promise, so response.status().send()/response.send() was getting called before promise is settled (fulfilled or rejected)

Code Snippet

app.get(`${ROUTES.USERS}/:id`, async (request, response) => {
    const _id = request.params.id;
    try {
        // was getting error when not used await
        const user = await User.findById(_id);
        if (!user) {
            response.status(HTTP_STATUS_CODES.NOT_FOUND).send('no user found');
        } else {
            response.send(user);
        }
    } catch (e) {
        response
            .status(HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR)
            .send('Something went wrong, try again after some time.');
    }
});

2 Comments

Same, even I faced this issue.
Excellent. This was the best answer for me. I was also not using await in the call!
3

This is because JavaScript structures that include circular references can't be serialized with a"plain" JSON.stringify.

https://www.npmjs.com/package/circular-json mentioned by @Dinesh is a good solution. But this npm package has been deprecated.

So use https://www.npmjs.com/package/flatted npm package directly from the creator of CircularJSON.

Simple usage. In your case, code as follows

import package

// ESM
import {parse, stringify} from 'flatted';

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

and

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

1 Comment

This gives me a return value totally different from the original object?
2

Came across this issue in my Node Api call when I missed to use await keyword in a async method in front of call returning Promise. I solved it by adding await keyword.

Comments

1
          AxiosService({
            method: 'POST',
            url: '/products',
            data: {
                name: productNumber,
                number: productNumber,
                description: productDescription,
                type: category,
                price: 0,
            },
        })

In my case I made mistake in the payload data when making request. By mistake I was setting description as e.target instead of e.target.value when taking input.

Comments

0

I came across this issue when not using async/await on a asynchronous function (api call). Hence adding them / using the promise handlers properly cleared the error.

Comments

0

I was missing .toArray() when making a call to a MongoDB collection to retrieve multiple documents.

This was throwing the error: doc = await database.find({ "type": ctx.params.type });

This was the fix: doc = await database.find({ "type": ctx.params.type }).toArray();

Here's a link to the documentation about it: https://www.mongodb.com/docs/manual/reference/method/cursor.toArray/

Comments

0

One of the reasons I got this error was that I was sending the full response object returned by Axios using res.send() in an Express app.

app.get('/fetch', async (req, res) => {
  const targetUrl = req.query.url;

  if (!targetUrl) {
    return res.status(400).json({ error: 'Missing url query parameter' });
  }

  try {
    const response = await axios.get(targetUrl, {
      headers: {
        'Accept': 'text/html',
      }
    });
    
    await res.status(200).send(response);
  } catch (error) {
    console.error('Error fetching:', error.message);
    res.status(500).json({ error: 'Failed to fetch content' });
  }
});

These objects often contain non-serializable internal fields — especially in the case of Axios. For example, response.request and response.config can contain circular references like:

request → response → request

I solved it by sending only the data field as the response, but I'm still looking for a solution that would allow me to send the entire response object safely.

Comments

-1

enter image description here

If an object has a different type of property like mentioned in the above image, JSON.stringify() will through an error.

1 Comment

This question is asked more than 8 years ago and it has an accepted answer. Please add some details about the reason you are adding a new answer
-2

For mongodb

so if you are getting errors while fetching data from MongoDB then the problem is async

previously enter image description here

app.get('/users',(req,res,next)=>{
 
 const user=chatUser.find({});
 
 if(!user){
 
 res.status(404).send({message:"there are no users"});
 
 
 }
 
 if(user){
 
 res.json(user);
 
 }
})

After

app.get('/users',async(req,res,next)=>{
 
 const user=await chatUser.find({});
 
 if(!user){
 
 res.status(404).send({message:"there are no users"});
 
 
 }
 
 if(user){
 
 res.json(user);
 
 }
 
})

Comments

-2

Edit May 22, 2023

I think it is an error which need to be fixed not a feature which is needed. I have faced this issue and tried following things. Hope it helps.

  1. The reference does not have resolved value till the time, we are going to use it. In this case, I have awaited the response, by adding await keyword and checking whether I am returning proper value from the function.

  2. In the second case when I faced this issue I had a json like,

    { obj1: "sample1", obj2: "sample2", obj3: obj3 }

or,

{
 obj1: "sample1",
 obj2: obj1
}

in this case, the value of any of the key in object is again depended on some other key, which was growing the json object recursively. Here, I fixed this dependency of one key on another to resolve it.

1 Comment

This does not really answer the question. If you have a different question, you can ask it by clicking Ask Question. To get notified when this question gets new answers, you can follow this question. Once you have enough reputation, you can also add a bounty to draw more attention to this question. - From Review
-5

Try this as well

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

2 Comments

JSON.parse(JSON.stringify()) - What the point in this code snippet?!
I am afraid this might be a plausible workaround.
-8

TypeError: Converting circular structure to JSON in nodejs: This error can be seen on Arangodb when using it with Node.js, because storage is missing in your database. If the archive is created under your database, check in the Aurangobi web interface.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.