2023.12.13(수)
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
// 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)
로 사용할 수 있을 것이다.