본문 바로가기
Do it Node.js/EJS BackEnd

11. 미들웨어

by 갱생angel 2024. 3. 6.

미들웨어 : 요청과 응답 중간에서 요청을 처리하거나 응답을 수정하는 함수

  -요청 객체나 응답 객체의 속성을 가져오거나 수정하고, 함수 내에서 종료할 수 있음

  -함수 안에서 응답이 종료되지 않고 다음 함수로 넘길 수 있음

  -작성하는 순서가 중요

바디파서 : 요청 본문에 내용을 프로그램에서 사용할 수 있는 형식으로 변환

 

<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;

'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