๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JS

[JavaScript] : TypeError: Converting circular structure to JSON ์˜ค๋ฅ˜ํ•ด๊ฒฐ

by ๊ถŒ์Šพํ–„ 2023. 6. 14.

 

 
๋™๊ธฐ(synchronous)์™€ ๋น„๋™๊ธฐ(asynchronous)
// ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ

๋™๊ธฐ : ํ˜„์žฌ์˜ ์ˆœ์„œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์ข…๋ฃŒ๋œ ํ›„์— ๋‹ค์Œ ์‹คํ–‰์ด ์ด๋ค„์ง„๋‹ค.

์˜ˆ์‹œ ๋†€์ด๊ธฐ๊ตฌ : ์—ด์ฐจ ํ•˜๋‚˜์— ์Šน๊ฐ์„ ํƒœ์šฐ๊ณ  ์ถœ๋ฐœํ•˜๋ฉด
๋‹ค์Œ ์Šน๊ฐ์€ ์•ž์˜ ์—ด์ฐจ๊ฐ€ ์šดํ–‰์„ ๋งˆ์น˜๊ณ  ๋“ค์–ด์™€์„œ ์Šน๊ฐ๋“ค์ด ๋‚ด๋ ค์•ผ๋งŒ ํƒ‘์Šน์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๊ทธ๋ž˜์„œ ๋™๊ธฐ์ ์ด๋‹ค.

๋น„๋™๊ธฐ : ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด ๋จผ์ € ์ฒ˜๋ฆฌ๋œ ์ˆœ์„œ๋Œ€๋กœ ๊ฒฐ๊ณผ๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค.

์˜ˆ์‹œ ๋ง›์ง‘ : ๋“ค์–ด๊ฐ€๋Š” ์ˆœ์„œ๋Š” ์„ ์ฐฉ์ˆœ์ธ ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด๊ฐ€์ง€๋งŒ
๋‚˜์˜ค๋Š” ์ˆœ์„œ๋Š” ์‹์‚ฌ๋ฅผ ๋นจ๋ฆฌ ๋งˆ์นœ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์—
๋น„๋™๊ธฐ ์ ์ด๋‹ค.
์‹คํ˜„ ์‹œํ‚ค๊ณ ์ž ํ•˜๋Š” ๊ธฐ๋Šฅ

 

  • API๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋‹น URI๋กœ ์ ‘๊ทผํ•˜์—ฌ DB์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” Read์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„์‹œํ‚ค๊ณ ์ž ํ•œ๋‹ค.
์˜ค๋ฅ˜ ๋ฐœ๊ฒฌ
router.get('/posts', (req, res) => {
    const posts = Posts.find().sort({ createdAt: -1 });
    res.status(200).json({ data: posts });
});

GET๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ localhost:3050 ํฌํŠธ์˜ /posts ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•˜๋ฉฐ,

Posts๋ผ๋Š” ๋ชจ๋ธ์—์„œ find ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ฐพ์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ json ํ˜•ํƒœ๋กœ ๋ฐ›์„๊ฒƒ์ด๋‹ค.

์œ„ ์ฝ”๋“œ์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ.

Status: 500 Internal Server Error

TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'MongoClient'
    |     property 's' -> object with constructor 'Object'
    |     property 'sessionPool' -> object with constructor 'ServerSessionPool'
    --- property 'client' closes the circle

status 500 ์ด๋ผ๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ๋ณดํ†ต ์ข…์†์„ฑ์ด๋‚˜ ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ผ๊ณ  ํ•œ๋‹ค.

์ด ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” JavaScript์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜์ด๋ฉฐ,
์ฃผ๋กœ JSON.stringify()์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๊ณ ,
์˜ค๋ฅ˜์˜ ์›์ธ์€ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” '์ˆœํ™˜์ฐธ์กฐ'๊ฐ€ ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ˆœํ™˜์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์œ„ ์ฝ”๋“œ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„
  1. ํด๋ผ์ด์–ธํŠธ์—์„œ api๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์—๊ฒŒ db์—์„œ posts์˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ์š”์ฒญํ–ˆ๊ณ ,
  2. ์„œ๋ฒ„๋Š” db์—์„œ posts์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค.
  3. ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฑธ db๋กœ๋ถ€ํ„ฐ ์„œ๋ฒ„๋Š” ๋ฐ›์•„์˜ค๊ณ ,
  4. ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์šฐ๋ฆฌ์—๊ฒŒ ๋ณด๋‚ด์ค€๋‹ค.

์ด ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€์•Š๊ณ , ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด์„œ,
๊ผญ ํ•„์š”ํ•œ ๊ณผ์ •์€ ์„œ๋ฒ„๊ฐ€ db๋กœ๋ถ€ํ„ฐ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ์ „๊นŒ์ง€๋Š” ๋‹ค๋ฅธ ๋กœ์ง์ด ์‹คํ–‰์ด ๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ง์ธ ์ฆ‰์Šจ, ๋™๊ธฐ์ ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด๋ผ๋Š” ๋œป.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋Š” ๋ถ€๋ถ„์ค‘์— db์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋กœ์ง์„ ์‹คํ–‰์‹œ์ผœ์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ๋Š” ํ•ญ์ƒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์—ผ๋‘์— ๋‘์–ด์•ผ๊ฒ ๋‹ค.

์˜ค๋ฅ˜ ํ•ด๊ฒฐ
router.get('/posts', async (req, res) => {
    const posts = await Posts.find().sort({ createdAt: -1 });
    res.status(200).json({ data: posts });
});

ํ•จ์ˆ˜ ์‹œ์ž‘์•ž์— async๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋™๊ธฐ์ ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๊ณ , ์šฐ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ธ find๋ฉ”์„œ๋“œ ์•ž์— await์„ ๋ถ™์ž„์œผ๋กœ์จ ์ด ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

๊ฒฐ๊ณผ
Status: 200 OK

{
  "data": [
    {
      "_id": "648b46da41f1e2639933139e",
      "user": "์œ ์‚ฌ์žฅ",
      "password": 4,
      "title": " ์ถ”๊ฐ€",
      "content": "๊ฐ€?",
      "createdAt": "2023-06-15T17:14:02.746Z",
      "__v": 0
    },
    {
      "_id": "648b469f41537a61e0b930d9",
      "user": "์žฅ์‚ฌ์žฅ",
      "password": 3,
      "title": "์ž‘์„ฑ๋‚ ์งœ ์ถ”๊ฐ€",
      "content": " ์•„๋‹Œ๊ฐ€?",
      "createdAt": "2023-06-15T17:13:03.663Z",
      "__v": 0
    },
    {
      "_id": "648b36b85b1ee47badb69cf7",
      "user": "์ •์‚ฌ์žฅ",
      "password": 2,
      "title": "์ž‘์„ฑ๋‚ ์งœ ์ถ”๊ฐ€",
      "content": "๋‚ด๋ฆผ์ฐจ์ˆœ ์„ค์ •์ค‘",
      "createdAt": "2023-06-15T16:05:12.788Z",
      "__v": 0
    },
    {
      "_id": "648b245829023c114601f315",
      "user": "๋ฐ•๊ฑฐ์„ฑ",
      "password": 1,
      "title": "์ž‘์„ฑ๋‚ ์งœ ์ถ”๊ฐ€",
      "content": "๊ฒฐ๊ณผ๋Š”?",
      "createdAt": "2023-06-15T14:46:48.146Z",
      "__v": 0
    }
  ]
}

 

์œ„์™€๊ฐ™์ด ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•จ์œผ๋กœ์จ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ๊ฐ€์ ธ์™”๊ณ , ์ฝ”๋“œ์— ๋งž๊ฒŒ ์ถœ๋ ฅ์ด ๋œ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

#javascript #์˜ค๋ฅ˜ #์˜ค๋ฅ˜ํ•ด๊ฒฐ

#๋™๊ธฐ_๋น„๋™๊ธฐ

#async_await

#get์š”์ฒญ

#Read_๊ตฌํ˜„

#mongoose #mongodb