ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Node.js] JSON 직렬화와 Map 객체
    JavaScript 2024. 1. 8. 22:12
    반응형

    <링크>

    https://github.com/heeheehoho/DevCourse/blob/main/backend/NodeBase/demo-api/blogger-demo.js

     

    <오류난 부분>

    app.get("/bloggers", function (req, res) {
        res.json(db);
    });

    res.json(db)로 하면 안되는 이유?

    - "db"Map 객체이기 때문. Express의 res.json() 메소드는 JavaScript 객체나 배열을 JSON 형식의 문자열로 변환하여 클라이언트에게 응답으로 보내는데, Map 객체는 기본적으로 JSON으로 직렬화(Serialization)되지 않음.

     

    JSON 직렬화와 Map 객체

    - 직렬화 불가: JavaScript의 Map 객체는 키-값 쌍을 저장하는 구조이다. 하지만, 이 구조는 기본적으로 JSON 형식으로 직렬화할 수 없다. JSON.stringify 메소드를 사용해도 Map 객체는 빈 객체 {}로 직렬화 됨

    - 배열 변환 필요: Map 객체의 내용을 JSON으로 전송하려면, 먼저 Map의 키-값 쌍을 배열이나 일반 객체로 변환해야 함. 예를 들어 Array.from(db.entries())를 사용하면 Map의 각 항목을 배열로 변환할 수 있음

     

    <수정>

    app.get("/bloggers", function (req, res) {
        const bloggers = Array.from(db.values());
        res.json(bloggers);
    });

     

     

    <전체 코드>

    /*
    object-api-demo.js 파일 참고
    */
    
    //express 모듈 세팅
    const express = require('express')
    const app = express()
    
    // JSON 형식의 요청 본문을 파싱하기 위한 미들웨어
    app.use(express.json())
    
    // 데이터 세팅
    let blogger1 = {
        blogName: "jungheeho",
        view: "1104명",
        descrpition: "열공티비"
    
    }
    let blogger2 = {
        blogName: "suddiyo",
        view: "4946명",
        descrpition: "꾸준히 기록하고 성장하는 백엔드 개발자"
    
    }
    let blogger3 = {
        blogName: "third",
        view: "3333명",
        descrpition: "hello"
    
    }
    let db = new Map()  //map 객체인 db로 데이터 저장라는 데이터베이스 역할(id를 키로) / key-value형식
    var id = 1
    db.set(id++, blogger1)
    db.set(id++, blogger2)
    db.set(id++, blogger3)
    
    // REST API 설계
    app.get("/bloggers", function (req, res) {
        const bloggers = Array.from(db.values());
        res.json(bloggers);
    });
    
    app.get('/blogger/:id', function (req, res) {
        let { id } = req.params;
        id = parseInt(id);
        const blogger = db.get(id);
        if (blogger == undefined) {
            res.status(404).json({
                message: "블로거를 찾을 수 없음"
            });
        } else {
            res.json(blogger);
        }
    });
    
    app.post('/blogger', function (req, res) {
        const newBlogger = req.body;
        db.set(id++, newBlogger);
        res.json({
            message: `${newBlogger.blogName} 블로거 생활을 환영합니다!`
        });
    });
    
    app.listen(3000, () => {
        console.log("서버가 3000번 포트에서 시작되었습니다.");
    });

    <전체 코드>

     

    반응형
Designed by Tistory.