미들웨어 : 요청과 응답 중간에서 요청을 처리하거나 응답을 수정하는 함수
-요청 객체나 응답 객체의 속성을 가져오거나 수정하고, 함수 내에서 종료할 수 있음
-함수 안에서 응답이 종료되지 않고 다음 함수로 넘길 수 있음
-작성하는 순서가 중요
바디파서 : 요청 본문에 내용을 프로그램에서 사용할 수 있는 형식으로 변환
<app.js>, routes - <contactRoutes.js> : 라우터 객체 생성, 라우터를 외부 파일로 관리하기
※.Router() : 라우터 객체
※.route() : 라우터 지정
※.use([경로], 미들웨어) : 실행할 미들웨어를 등록
//app.js
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.status(200).send("Hello Node");
});
app.use("/contact", require("./routes/contactRoutes")); //contactRoutes.js 미들웨어를 등록
app.listen(3000, () => {
console.log("3000 포트에서 서버 실행 중");
});
//contactRoutes.js
const express = require("express");
const router = express.Router(); //router 인스턴스 생성
router
.route("/")
.get((req, res) => { //모든 데이터 가져오기
res.status(200).send("Contact Page");
})
.post((req, res) => { //새 데이터 추가하기
res.status(201).send("Create Contact");
});
router
.route("/:id")
.get((req, res) => { //특정 ID 데이터 가져오기
res.status(200).send(`View Contact for ID : ${req.params.id}`);
})
.put((req, res) => { //특정 ID 데이터 수정하기
res.status(200).send(`Update Contact for ID : ${req.params.id}`);
})
.delete((req, res) => { //특정 ID 데이터 삭제하기
res.status(200).send(`Delete Contact for ID : ${req.params.id}`);
});
module.exports = router; //모듈을 외부로 내보냄
<app.js>, routes - <contactRoutes.js> : 바디파서로 요청 본문 파싱
※req.body : 요청 본문
※.json() : JSON 형식으로 본문을 파싱
- req.body을 프로그래밍에 사용하려면 JSON 형식으로 변환
※.urlencoded() : URL로 인코딩된 본문을 파싱
-쿼리 스트링 : 사용자가 서버로 자료를 보낼 떄 URL에 파라미터 형태로 포함시켜 보내는 문자열
-extended : true : qs 모듈을 사용하여 쿼리 스트링을 해석, 복잡한 객체나 배열까지 파싱
-qs : 쿼리 스트링을 파싱하거나 스트링화하는 라이브러리
//app.js
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.status(200).send("Hello Node");
});
app.use(express.json()); //req.body 내용을 JSON 형식으로 변환
app.use(express.urlencoded({ extended: true })); //쿼리 스트링을 해석
app.use("/contact", require("./routes/contactRoutes"));
app.listen(3000, () => {
console.log("3000 포트에서 서버 실행 중");
});
//contactRoutes.js
const express = require("express");
const router = express.Router();
router
.route("/")
.get((req, res) => {
res.status(200).send("Contact Page");
})
.post((req, res) => {
console.log(req.body); //요청 본문을 콘솔 창에 출력
const { name, email, data } = req.body; //name, email, data를 요청 본문에 할당
if (!name || !email || !data) { //name, email, data을 입력하지 않았을 경우
return res.status(400).send("No Input Data");
}
res.status(201).send("Create Contact"); //name, email, data을 입력했을 경우
});
router
.route("/:id")
.get((req, res) => {
res.status(200).send(`View Contact for ID : ${req.params.id}`);
})
.put((req, res) => {
res.status(200).send(`Update Contact for ID : ${req.params.id}`);
})
.delete((req, res) => {
res.status(200).send(`Delete Contact for ID : ${req.params.id}`);
});
module.exports = router;
<app.js>, middlewares - <errorhandle.js> : 오류 처리 미들웨어, 바로 다음에 있는 미들웨어 호출
※next() : 현재 미들웨어에서 바로 다음에 있는 미들웨어를 호출하는 함수
//app.js
const express = require("express");
const errorHandle = require("./middlewares/errorhandle"); //오류 처리 모듈 등록
const app = express();
app.get("/", (req, res) => {
res.status(200).send("Hello Node");
});
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use("/contact", require("./routes/contactRoutes"));
app.get("/test", (req, res, next) => { //테스트용 서버
const error = new Error("테스트용 에러"); //임의의 에러 생성
error.status = 401; //에러 상태 코드를 401로 지정
next(error); //그 다음 미들웨어로 넘김
});
app.use(errorHandle); //errorHandle 미들웨러 등록
app.listen(3000, () => {
console.log("3000 포트에서 서버 실행 중");
});
//errorhandle.js
const errorHandle = (err, req, res, next) => { //errorHandle 함수 생성
const status = err.status; //상태코드 변수
switch (status) {
case 400: //잘못된 요청
res.status(status).json({
title: "Bad Request",
message: err.message,
});
break;
case 401: //권한 없음
res.status(status).json({
title: "Unauthorized",
message: err.message,
});
break;
case 403: //금지됨
res.status(status).json({
title: "Forbidden",
message: err.message,
});
break;
case 404: //찾을 수 없음
res.status(status).json({
title: "Not Found",
message: err.message,
});
break;
case 500: //서버 오류
res.status(status).json({
title: "Internal Server Error",
message: err.message,
});
break;
default: //에러 없음
res.status(status).json({
message: "No Error",
});
break;
}
};
module.exports = errorHandle;
![](https://blog.kakaocdn.net/dn/Lb9WM/btsFAfqfo46/2v3guJIRiO8XKjBtcu7Yo0/img.png)
'Do it Node.js > EJS BackEnd' 카테고리의 다른 글
13. RESTful API (0) | 2024.03.11 |
---|---|
12. 몽고DB, 스키마 (0) | 2024.03.08 |
10. Express (0) | 2024.03.03 |
9. Node 비동기 처리 (0) | 2024.03.01 |
8. 라우팅 (0) | 2024.03.01 |