nestjs 공부를 위한 express 아키텍처 선행학습
src
├── app.ts
└── cats
├── cats.model.ts
├── cats.route.ts
└── cats.service.ts
싱글톤, 미들웨어, 라우터, 404error 핸들링 처리
import * as express from "express";
import catsRouter from "./cats/cats.route";
class Server {
public app: express.Application;
constructor() {
const app: express.Application = express();
this.app = app;
}
private setRoute() {
this.app.use(catsRouter);
}
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"});
});
}
public listen(){
this.app.listen(8000, () => {
console.log('server is on ...');
});
}
}
function init(){
const server = new Server();
server.listen();
}
init();
라우터 설정
import {Router} from "express";
import {createCat, deleteCat, readAllCat, readCat, updateCat, updatePartialCat} from "./cats.service";
const router = Router();
router.get('/cats', readAllCat);
router.get('/cats/:id', readCat);
router.post('/cats', createCat);
router.put('/cats/:id', updateCat);
router.patch('/cats/:id', updatePartialCat);
router.delete('/cats/:id', deleteCat);
export default router;
로직
import {Request, Response} from "express";
import {Cat, CatType} from "./cats.model";
// READ 고양이 전체 데이터 다 조회
export const readAllCat = (req: Request, res: Response) => {
try {
const cats = Cat;
// throw new Error("db connect error");
res.status(200).send({
success: true,
data: {
cats,
},
});
} catch ({message}) {
res.status(400).send({
success: false,
error: message,
})
}
};
// READ 특정 고양이 데이터 조회
export const readCat = (req: Request, res: Response) => {
try {
const params = req.params;
console.log(params);
const cat = Cat.find((cat) => {
return cat.id === params.id;
});
// throw new Error("db connect error");
res.status(200).send({
success: true,
data: {
cat,
// hey: true,
},
});
} catch ({message}) {
res.status(400).send({
success: false,
error: message,
});
}
};
// CREATE 새로운 고양이 추가
export const createCat = (req: Request, res: Response) => {
try {
const data = req.body;
console.log(data);
Cat.push(data);
res.status(200).send({
success: true,
data: {data},
});
} catch ({message}) {
res.status(400).send({
success: false,
error: message,
})
}
};
// UPDATE 고양이 데이터 업데이트 -> PUT
export const updateCat = (req: Request, res: Response) => {
try {
const params = req.params;
const body = req.body;
let result;
Cat.forEach((cat) => {
if (cat.id === params.id) {
cat = body;
result = cat;
}
});
// throw new Error("db connect error");
res.status(200).send({
success: true,
data: {
result,
},
});
} catch ({message}) {
res.status(400).send({
success: false,
error: message,
});
}
};
// UPDATE 고양이 데이터 부분적으로 업데이트 -> PATCH
export const updatePartialCat = (req: Request, res: Response) => {
try {
const params = req.params;
const body = req.body;
let result;
Cat.forEach((cat) => {
if (cat.id === params.id) {
cat = {...cat, ...body};
result = cat;
}
});
// throw new Error("db connect error");
res.status(200).send({
success: true,
data: {
result,
},
});
} catch ({message}) {
res.status(400).send({
success: false,
error: message,
});
}
};
// UPDATE 고양이 데이터 삭제 -> DELETE
export const deleteCat = (req: Request, res: Response) => {
try {
const params = req.params;
const newCat = Cat.filter((cat) => cat.id !== params.id);
// throw new Error("db connect error");
res.status(200).send({
success: true,
data: newCat
});
} catch ({message}) {
res.status(400).send({
success: false,
error: message,
});
}
};
app.ts
V
middleware, router
V
services
V
error handling