app.get("/cats", (req,res)=>{
try{
const cats = Cat
// throw new Error("db connect error")
// 위 throw문 활성화 시 catch문 실행
res.status(200).send({
success: true,
data: {
cats, // 전체 데이터 반환
}
})
} catch(error){
res.status(400).send({
success: false,
error: error.message // 에러메시지 반환
})
}
})
주소에 파라미터값을 동적으로 입력받을 수 있음(:를 사용하여)
app.get("/cats/:id", (req,res)=>{
try{
const params = req.params; // 전달받은 파라미터값을 params에 저장
const cat = Cat.find((cat) => { // 객체에서 해당 id와 동일한 id를 찾음
return cat.id === params.id
})
res.status(200).send({
success: true,
data: {
cat, // 해당 데이터 반환
}
})
} catch(error){
res.status(400).send({
success: false,
error: error.message // 에러 메시지 반환
})
}
})
express 에서 json body 내용을 읽으려면 미들웨어를 추가해줘야함(기본으론 지원 안됨)
//* json middleware
app.use(express.json())
app.post("/cats", (req, res) => {
try{
const data = req.body // 전달받은 body값을 data에 저장
Cat.push(data) // 데이터 삽입
res.status(200).send({
success: true,
data: { data }
})
} catch(error){
res.status(400).send({
success: false,
error: error.message
})
}
})
데이터 일부 수정이 아닌 덮어쓰기의 경우 put을 사용
router.put("/cats/:id", (req, res) =>{
try{
const params = req.params
const body = req.body
let result
Cat.forEach((cat)=>{ // 반복문을 돌며 하나하나 꺼내옴
if(cat.id === params.id){ // 수정하려는 id와 동일하다면
cat = body // 입력받은 값을 덮어씌움
result = cat
}
})
res.status(200).send({
success: true,
data: {
cat: result
}
})
} catch(error){
res.status(400).send({
success: false,
error: error.message
})
}
})
데이터 일부 수정 (UPDATE - PATCH)
구조 분해 할당을 이용
- 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 JavaScript 표현식
- request의 body를 나중에 삽입하여, 동일한 key값에 대한 덮어쓰기를 구현
router.patch("/cats/:id", (req, res) =>{
try{
const params = req.params
const body = req.body
let result
Cat.forEach((cat)=>{
if(cat.id === params.id){
cat = { ...cat, ...body } // 구조분해할당
result = cat
}
})
res.status(200).send({
success: true,
data: {
cat: result
}
})
} catch(error){
res.status(400).send({
success: false,
error: error.message
})
}
})
router.delete("/cats/:id", (req, res) =>{
try{
const params = req.params
// filter를 이용해 동일하지 않은 데이터만 출력(실질적인 삭제가 아닌 출력만 필요할 경우)
const newCat = Cat.filter((cat) => cat.id !== params.id)
res.status(200).send({
success: true,
data: newCat
})
} catch(error){
res.status(400).send({
success: false,
error: error.message
})
}
})
app.ts
import catRouter from "./cats/cats.route"
app.use(catRouter) // 미들웨어 끼워넣기
분리된 라우터
- express에서 라우터를 import
import { Router } from "express";
const router = Router()
// 기능구현
import { createCat, deleteCat, readAllcat, readCat, updateCat, updatePartialCat } from './cats.service';
const router = Router()
//* READ 고양이 전체 데이터 조회
router.get("/cats", readAllcat)
~
export default router
import { Request, Response } from "express"
import { Cat, CatType } from './cats.model'
//* READ 고양이 전체 데이터 조회
export const readAllcat = (req: Request, res: Response)=>{
// 실행 로직
}
~
하나의 인스턴스만 생성하여 사용하는 것
import * as express from "express";
import catRouter from "./cats/cats.route"
class Server {
public app: express.Application;
constructor() {
const app: express.Application = express()
this.app = app;
}
private setRoute() {
this.app.use(catRouter) // 라우터에 선언된 액션을 import하여 가져옴
}
private setMiddleware(){
//* logging middleware
this.app.use((req, res, next) => {
console.log(req.rawHeaders[1])
console.log("this is logging middleware")
next()
})
//* json middleware
this.app.use(express.json())
this.setRoute(); // 위 선언된 메소드 실행
//* 404 middleware
this.app.use((req, res, next) => {
console.log("this is error middleware")
res.send({ error: "404 not found error" })
})
}
public listen() { // 선언 시 실행시킬 메소드
this.setMiddleware()
this.app.listen(8000, () => {
console.log("server is on...")
})
}
}
function init() {
const server = new Server(); // 런타임 시 하나의 인스턴스만 선언
server.listen()
}
init()