본문 바로가기
javascript, node

미들웨어란?

by devyongi 2021. 11. 1.

미들웨어란?

  • 요청과 응답 사이에 위치한 함수이다. (밑에와 같이 생긴 함수)
app.use();
app.get("/", (req, res, next) => {});
  • 개발에 도움을 주는 미들웨어로 cookie-parser, body-parser, cors, morgan 등이 있다. 별도로 설치를 하여 사용하였지만, 요즘은 대부분 미들웨어가 express에 내장되어 있다. 미들웨어
  • 위에서 아래로 순서대로 실행된다.
  • 요청(req), 응답(res)을 조작할 수 있다.
  • next를 사용하여 다음 미들웨어로 넘어갈 수 있다.

에러처리 미들웨어

app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send("Something broke!");
});

에러처리 미들웨어는 반드시 err, req, res, next 4개의 인자를 넣어주어야한다. 다른 미들웨어에서 next(err)로 에러를 넘겨주면 에러처리 미들웨어로 전달이 되고, 에러를 처리해준다.

next

미들웨어에서는 인자로 next를 추가하여 next함수를 호출할 수 있다. next를 호출하면 다음 미들웨어로 넘어가게 된다.

  • next() : 기본적안 호출로 다음 미들웨어로 넘어간다.
  • next(err) : 에러처리 미들웨어로 넘어간다. next안의 err 내용은 에러처리 미들웨어의 err인자로 들어간다.
  • next("route") : 다음 미들웨어로 넘어가지 않고, 다음 라우터로 넘어간다. if문으로 분기처리할 때, 종종 쓰인다고 한다. 아래와 같이 테스트 할 수 있다.
app.get(
  "/",
  (req, res, next) => {
    console.log("미들웨어1");
    next("route");
  },
  (req, res, next) => {
    console.log("미들웨어2");
    next();
  }
);

app.get("/", (req, res, next) => {
  console.log("다른 라우터");
  next();
});

// 미들웨어1
// 다른 라우터

미들웨어 간 데이터 전달

app.use(
  (req, res, next) => {
    req.data = "data";
    res.data = "data2";
    next();
  },
  (req, res, next) => {
    console.log(req.data, res.data); // data data2
    next();
  }
);

req나 res 객체에 임의의 키값을 부여하고 데이터를 넣어주면 다른 미들웨어에서 데이터를 사용할 수 있다. 주의할 점은 req.cookies, req.body와 같은 미들웨어와 겹치지 않도록 해야한다.

미들웨어 확장

미들웨어 안에서 또 미들웨어를 사용하고 싶을 때 사용하는 방식이다. 안쪽 미들웨어에 (req,res,next)만 붙여주면 된다. 아래와 같이 사용할 수 있다.

app.use((req, res, next) => {
  if (process.env.NODE_ENV === "production") {
    morgan("combined")(req, res, next);
  } else {
    morgan("dev")(req, res, next);
  }
});

참고

Node교과서 - 제로초

'javascript, node' 카테고리의 다른 글

실행 컨텍스트(Execution Context) - Record  (0) 2021.12.28
javascript ++연산자  (0) 2021.11.27
Event Loop가 무엇일까?  (0) 2021.11.16
sort에 대해서 좀 더 알아보기  (0) 2021.11.06
node 서버(app.js 코드 구조)  (0) 2021.10.31

댓글