1️⃣ 핸들러(Handler)란?

2️⃣ if 긍정문
app.delete('/youtubers/:id', (req, res) => {
let {id} = req.params
id = parseInt(id)
let youtuber = db.get(id)
if (youtuber) { // TRUE에 해당하는 값을 넣어주면 됨
const channelTitle = youtuber.channelTitle
db.delete(id)
res.json({
message : `${channelTitle}님, 아쉽지만 다음에 뵙겠습니다.`
})
} else {
res.json({
message : `요청하신 ${id}의 정보를 찾을 수 없습니다`
})
}
})
3️⃣ path는 route?



1️⃣ 배열과 find()를 배워보자
const express = require('express')
const app = express()
app.listen(3000)
const fruits = [
{id : 1, name : 'apple'},
{id : 2, name : 'orange'},
{id : 3, name : 'strawberry'},
{id : 4, name : 'blueberry'}
] // 이렇게 작성하면 배열 형태로 저장이 됨
// 과일 전체조회
app.get('/fruits', (req, res) => {
res.json(fruits)
}) // 배열로 저장된 것을 확인할 수 있음

// 과일 개별조회
app.get('/fruits/:id', (req, res) => {
let id = req.params.id
let fruit = fruits[id]
res.json(fruit)
})

app.get('/fruits/:id', (req, res) => {
let id = req.params.id
let fruit = fruits[id-1]
res.json(fruit)
})
app.get('/fruits/:id', (req, res) => {
let id = req.params.id
// foreach문을 이용해서 id가 1인 것을 찾아내보자
fruits.forEach((fruit) => { // fruit을 하나씩 꺼내서 확인 해보기
if (fruit.id == id) { // 만약 fruit의 id값이 req.params로 불러온 id가 같으면
findfruit = fruit // findefruit에 fruit을 담아줌
}
})
res.json(findfruit) // 담은 fruite을 보냄
})
app.get('/fruits/:id', (req, res) => {
let id = req.params.id
let findfruit = // 찾아내는 것을 한줄로 바로 적을 수도 있음
fruits.find( f => (f.id == id))
// fruits 배열에서 find 메서드로 객체를 찾을 것, f(객체)의 id값이 req.params로 불러온 id와 같은 객체
// 즉, fruits 배열 안 객체 중, id값이 req.params.id랑 같은 객체를 찾음
res.json(findfruit)
})
2️⃣ 예외처리 제대로 배우기

app.get('/fruits/:id', (req, res) => {
let id = req.params.id
let findfruit = fruits.find( f => (f.id == id))
if (findfruit) {
res.json(findfruit) // 담은 fruite을 보냄
} else { // 예외를 터트린다 = http status code가 성공이 아닌 실패로 전달할 것
res.json(
res.status(404).send( // 중간에 상태 메시지를 작성하여 찾는 것이 없다는 404에러를 보내줌
"전달 주신 파일이 없어요" // 그냥 보내면 프론트엔드는 모르니까 메시지도 보냄
)
)
}

✅ TIP : 위에서 볼 수 있듯 HTTP 상태코드는 클라이언트와 소통을 정확하게 하기 위함
1️⃣ 이 둘은 어떤 차이가 있을까?
if (1 == "1"){ // 자료형은 상관없이, 값만 비교함
console.log('같아')
} else {
console.log('다름')
}
if (1 === "1"){ // 자료형과 값 모두 동일해야 함
console.log('같아')
} else {
console.log('다름')
}
1️⃣ 전체조회에서 예외 고도화 해보기
app.get("/youtubers", (req, res) => {
let youtubers = {} // 변수를 json 형태로 변환
if (db) {
db.forEach((value, key) => { // 매개변수로 value, key를 각각 넣어줌
youtubers[key] = value
})
res.json(youtubers)
} else {
res.status(404).json({
message : "조회할 유튜버가 없어요"
})
}
})
유튜버 전체 지우기 후 결과를 보지만, 요소들은 다 지워졌지만 객체가 존재하기 때문에 404가 안 뜸

요소를 아무리 지워도 db에는 객체가 남아있기 때문에 "db.size가 0이 아닐 때"로 코드를 수정
app.get("/youtubers", (req, res) => {
let youtubers = {}
if (db.size !== 0) { // db.size가 0이 아닐 떄로 수정
db.forEach((value, key) => {
youtubers[key] = value
})
res.json(youtubers)
} else {
res.status(404).json({
message : "조회할 유튜버가 없어요"
})
}
})

2️⃣ get/delete/put 에도 예외처리 고도화를 해줌
app.get('/youtubers/:id', function (req, res){
let {id} = req.params
id = parseInt(id)
const youtuber = db.get(id)
if (youtuber == undefined) {
res.status(404).json({ // 여기다 추가
message : "정보를 찾을 수 없습니다"
})
} else {
res.json(youtuber)
}
})
app.delete('/youtubers/:id', (req, res) => {
let {id} = req.params
id = parseInt(id)
let youtuber = db.get(id)
if (youtuber == undefined) {
res.status(404).json({ // 여기에 추가
message : `요청하신 ${id}의 정보를 찾을 수 없습니다`
})
} else {
const channelTitle = youtuber.channelTitle
db.delete(id)
res.json({
message : `${channelTitle}님, 아쉽지만 다음에 뵙겠습니다.`
})
}
})
app.delete('/youtubers', (req, res) => {
if (db.size >= 1) {
db.clear()
res.json({
message : "모든 유튜버가 삭제되었습니다."
})
} else {
res.status(404).json({ // 이전에 사용한 msg를 빼고 상태코드 입력
message : "삭제할 유튜버가 없습니다."
})
}
})
app.put("/youtubers/:id", (req, res) => {
let {id} = req.params
id = parseInt(id)
let youtuber = db.get(id)
let oldTitle = youtuber.channelTitle
if (youtuber == undefined) {
res.status(404).json({ // 여기도 상태코드를 추가
message : `요청하신 ${id}의 정보를 찾을 수 없습니다`
})
} else {
let newTitle = req.body.channelTitle
youtuber.channelTitle = newTitle
db.set(id, youtuber)
res.json({
message : `${oldTitle}님, 채널명이 ${newTitle}님으로 변경되었습니다.`
})
}
})
3️⃣ post의 예외처리

app.use(express.json())
app.post('/youtubers', (req, res) => {
const channelTitle = req.body.channelTitle
if(channelTitle){ // body에 채널타이틀이 있으면 등록을 진행
db.set(id++, req.body)
res.status(201).json({message : `${db.get(id-1).channelTitle}님, 유튜브 가입을 축하합니다`}) // 200은 그냥 성공이니 201(등록성공)로 설정해줌
} else { // 아니라면
res.status(400).json({
// body값을 잘못 보낸 것은 클라이언트의 잘못이므로 400(서버가 요청의 구문을 인식하지 못함)을 써줌
message : '요청 값을 제대로 보내주세요'
})
}
})

1️⃣ 진짜 유튜브를 운영하는 것처럼 만들어보자!: API 기획
2️⃣ 웹페이지 기획 시각화
로그인 페이지

회원가입 페이지

마이 페이지

3️⃣ 회원 API 설계
${name}님 환영합니다 👉 메인 페이지를 출력${name}님 환영합니다 👉 로그인 페이지를 출력${name}님 다음에 또 뵙겠습니다. OR 메인페이지 출력1️⃣ 회원 API 코드 틀
const express = require('express')
const app = express()
app.listen(7777)
// 로그인
app.post('/login', (req, res) => {
})
// 회원가입
app.post('/join', (req, res) => {
})
// 회원 개별 조회
app.get('/users/:id', (req, res) => {
})
// 회원 개별 탈퇴
app.delete('/users/:id', (req, res) => {
})
2️⃣ 회원가입 구현/회원 개별 조회, 회원 개별 삭제
const express = require('express')
const app = express()
app.listen(7777)
app.use(express.json()) //http 외 모듈 사용 'json 모듈'
let db = new Map()
var id = 1 // 하나의 객체를 유니크 하게 구별하기 위함,
// 로그인
app.post('/login', (req, res) => {
let id = req.params.id
})
// 회원가입
app.post('/join', (req, res) => {
console.log(req.body)
if (req.body == {}) {
res.status(400).json({
message : `입력 값을 확인해주세여`
})
} else {
db.set(id++, req.body)
res.status(201).json({
message : `${db.get(id-1).name}님 환영합니당`
})
}
})
app
.route('/users/:id') // 루트를 활용헤서 url이 같은 것을 묶을 수 있음
// 회원 개별 조회
.get((req, res) => {
let {id} = req.params // {}는 비구조화, id 값을 따로 빼서 사용
id = parseInt(id)
const user = db.get(id)
if (user == undefined) {
res.status(404).json({
message : '회원정보가 없어요'
})
} else {
res.json({
userId : user.userId,
name : user,name
})
}
})
// 회원 개별 탈퇴
.delete((req, res) => {
let {id} = req.params // {}는 비구조화, id 값을 따로 빼서 사용
id = parseInt(id)
const user = db.get(id)
if (user == undefined) {
res.status(404).json({
message : '회원정보가 없어요'
})
} else {
db.delete(id)
res.status(200).json({
message : `${user.name}님 다음에 볼께요`
})
}
})