inversify-express-utils icon indicating copy to clipboard operation
inversify-express-utils copied to clipboard

TypeError: Converting circular structure to JSON

Open Alireza-Hallajian opened this issue 2 years ago • 2 comments

I get the "Converting circular structure to JSON" error in my project, and I know it happens in one of my "res.send"s. But it doesn't happen every time the API is called, as I sometimes see it in my logs. The server is in production mode and there is no report about it from users.

Environment

  • Inversify Version: 6.0.1
  • Node.js 18.16.1
  • Operating System and version: Ubuntu 22.04.2 LTS

Stack trace

TypeError: Converting circular structure to JSON --> starting at object with constructor 'ServerResponse' | property 'socket' -> object with constructor 'Socket' --- property '_httpMessage' closes the circle at JSON.stringify () at stringify (/home/lineage/workspace/posterity-refactored-backend/node_modules/express/lib/response.js:1150:12) at ServerResponse.json (/home/lineage/workspace/posterity-refactored-backend/node_modules/express/lib/response.js:271:14) at ServerResponse.send (/home/lineage/workspace/posterity-refactored-backend/node_modules/express/lib/response.js:162:21) at InversifyExpressServer. (/home/lineage/workspace/posterity-refactored-backend/node_modules/inversify-express-utils/src/server.ts:273:25) at step (/home/lineage/workspace/posterity-refactored-backend/node_modules/inversify-express-utils/lib/server.js:33:23) at Object.next (/home/lineage/workspace/posterity-refactored-backend/node_modules/inversify-express-utils/lib/server.js:14:53) at fulfilled (/home/lineage/workspace/posterity-refactored-backend/node_modules/inversify-express-utils/lib/server.js:5:58) at processTicksAndRejections (node:internal/process/task_queues:95:5)

Alireza-Hallajian avatar Oct 02 '23 11:10 Alireza-Hallajian

I also have the same problem which does not happen every time and it does not interrupt the operation but it is very annoying.

ingluis-code avatar Nov 09 '23 01:11 ingluis-code

I faced the same issue.

Based on my observation, the problem arises when the server's response is sent after connection is dropped and return res.sendStatus() syntax is used. In my case, I was able to resolve the issue by modifying the code as follows.

I changed this:

 public async healthCheck(req: Request, res: Response) {
    try {
      const results = await Promise.allSettled([
        checkDatabases(),
        [...]
      ]);
      [...]
      return res.sendStatus(200);
    } catch (error) {
      return res.sendStatus(500);
    }
  }

to this (removed return statement)

 public async healthCheck(req: Request, res: Response) {
    try {
      const results = await Promise.allSettled([
        checkDatabases(),
        [...]
      ]);
      [...]
       res.sendStatus(200);
    } catch (error) {
       res.sendStatus(500);
    }
  }

After this, I was no longer able to reproduce the issue. Not sure if this is expected behaviour.