웹 풀사이클 데브코스 TIL [Day 19] - Express에서 HTTP 상태 코드 보내기

JaeKyung Hwang·2023년 12월 13일
0
post-thumbnail

2023.12.13(수)

📨Express에서 HTTP 상태 코드 보내기

  • res.sendStatus(statusCode)🔗
    • HTTP 상태 코드(숫자)를 지정하고 등록된 상태 메시지를 text response body로 보냄

    • 알 수 없는 상태 코드가 지정된 경우 response body는 코드 번호만 가짐

      res.sendStatus(404) // Not Found
  • res.status(code)🔗
    • 응답의 HTTP 상태를 지정

    • Node의 response.statusCode와 chainable한 별칭(alias)임

      res.status(403).end()
      res.status(400).send('Bad Request')
      res.status(404).sendFile('/absolute/path/to/404.png')
      res.status(404).json({message : 'Not Found'})    // res에서 사용했던 method 모두 chainable
  • 상태 코드 적용 예시 (youtubr-demo.js)
    // Express module setting
    const express = require('express')
    const app = express()
    const port = 8888
    app.listen(port, () => console.log(`> Server is running on http://localhost:${port}/`))
    
    // Data settings
    let youtuber1 = {
        channelTitle: "(G)I-DLE (여자)아이들 (Official YouTube Channel)",
        sub: "725만명",
        videoNum: "810개"
    }
    
    let youtuber2 = {
        channelTitle: "때껄룩ᴛᴀᴋᴇ ᴀ ʟᴏᴏᴋ",
        sub: "158만명",
        videoNum: "321개"
    }
    
    let youtuber3 = {
        channelTitle: "Sungha Jung",
        sub: "713만명",
        videoNum: "1.4천개"
    }
    
    let db = new Map()  // Use Map as a DB
    var id = 0
    db.set(++id, youtuber1)
    db.set(++id, youtuber2)
    db.set(++id, youtuber3)
    
    /**
     * REST API 설계
     */
    // 0) 전체 유튜버 "조회"
    app.get('/youtubers', (req, res) => {
        if (db.size) {
            let youtubers = {}
            db.forEach((value, key) => youtubers[key] = value)
            res.json(youtubers)
        } else {
            res.status(404).json({ message: "조회할 유튜버가 없습니다." })
        }
    })
    // 1) 개별 유튜버 "조회"
    app.get('/youtubers/:id', (req, res) => {
        let { id } = req.params   // 문자열
        id = parseInt(id)       // 숫자로 변환
        if (db.has(id)) res.json(db.get(id))
        else res.status(404).json({ message: "유튜버 정보를 찾을 수 없습니다." })
    })
    
    // 2) 유튜버 "등록"
    app.use(express.json())
    app.post('/youtubers', (req, res) => {
        const channelTitle = req.body.channelTitle
        if (channelTitle) {
            db.set(++id, req.body)
            res.status(201).json({ message: `유튜버 "${channelTitle}"님이 등록되었습니다. (id = ${id})` })
        } else {    // channelTitle이라는 property가 없거나 비어 있으면
            res.status(400).json({ message: "요청 값이 잘못되었습니다." })
        }
    })
    
    // 3) 유튜버 "삭제"
    app.delete('/youtubers/:id', (req, res) => {
        let { id } = req.params
        id = parseInt(id)
        if (db.has(id)) {
            const channelTitle = db.get(id).channelTitle
            db.delete(id)
            res.json({ message: `유튜버 "${channelTitle}"님이 삭제되었습니다. (id = ${id})` })
        } else {
            res.status(404).json({ message: `존재하지 않는 유튜버입니다. (id = ${id})` })
        }
    })
    
    // 4) 전체 유튜버 "삭제"
    app.delete('/youtubers', (req, res) => {
        if (db.size) {
            db.clear()
            res.json({ message: "전체 유튜버가 삭제되었습니다." })
        } else {
            res.status(404).json({ message: "삭제할 유튜버가 없습니다." })
    
        }
    })
    
    // 5) 개별 유튜버 channelTitle "수정"
    app.put('/youtubers/:id', (req, res) => {
        let { id } = req.params
        id = parseInt(id)
        if (db.has(id)) {
            const oldTitle = db.get(id).channelTitle
            const newTitle = req.body.channelTitle
            db.get(id).channelTitle = newTitle
            res.json({ message: `유튜버 "${oldTitle}"님의 채널명이 "${newTitle}"(으)로 수정되었습니다. (id = ${id})` })
        } else {
            res.status(404).json({ message: `존재하지 않는 유튜버입니다. (id = ${id})` })
        }
    
    })

지금 코드에서 /youtubers/youtubers/:id의 path가 HTTP method만 다르고 많이 겹치는데 이 경우에는 app.route(path).get().post().delete()...를 이용해 chaining하거나 express의 Router를 이용해 따로 route handler (router)를 만들어 export하고 app.use(path, router)로 사용할 수 있을 것이다.

profile
이것저것 관심 많은 개발자👩‍💻

0개의 댓글