Node.js

[Node.js] Express 미들웨어란?

지은이: 김지은 2023. 4. 6. 22:51
728x90

미들웨어(Middleware)란?

HTTP 요청(req)과 응답(res) 중간(미들)에서 단계별 동작을 수행하는 함수로 HTTP요청이 들어온 순간부터 시작이 된다.

HTTP 응답이 마무리 될 때 까지 미들웨어 동작 사이클이 실행된다.

 

미들웨어 작성법

req, res, next를 가진 함수를 작성하면 미들웨어로 동작할 수 있다.

req: HTTP 요청 처리하는 객체

res: HTTP 응답 처리하는 객체

next: 다음 미들웨어로 요청을 넘기는 함수로 순차적으로 처리된다.

 

어플리케이션 미들웨어

app.use((req, res) => {
  console.log(`Request ${req.path}`);
});

app.get("/", (req, res) => {
  res.send("Hello Express");
});

app.listen(8080, () => {
  console.log("listening on 8080");
});

위 코드는 use()로 모든 요청이 지나가서 8080으로 실행이 된다고 콘솔에 찍히지만 app.get() 은 진행이 되지 않는다.

다음으로 넘어가기 위해서 next()함수를 사용해야 한다.

 

app.use((req, res, next) => {
    console.log(`Request ${req.path}`);
    next();
})

app.get('/', (req, res, next) => {
    res.send('Hello Express');
})

모든 요청을 다 처리 후 next()함수를 통해 다음 미들웨어를 호출한다. 호출하지 않으면 미들웨어 사이클이 멈춤

 

라우터 매개변수

/ 뒤에 :(콜론)을 사용한 와일드카드도 가능한데 예를 들어 /:id 라는 경로가 있으면 id를 req.params.id로 불러올 수 있다.

app.get('/page/:id', (req, res) => {
    console.log(req.params.id)
})

요청들어온 url이 page/123 이라면 {id: '123'}

* 코드를 위에서부터 읽기 때문에 다른 라우터보다 뒤에 위치시켜야 한다.

 

라우터 미들웨어

라우터 미들웨어는 router 객체에 미들웨어가 적용된다. 특정 경로의 라우팅에만 미들웨어를 적용하기 위한 방법

// index.js

const express = require("express");
const book = require("./routes/book");
const app = express();

app.get("/", (req, res, next) => {
  res.send("Hello Express");
});

app.use((req, res, next) => {
  console.log(`Request ${req.path}`);
  next();
});

app.use("/book", book);

app.listen(8080, () => {
  console.log("listening on 8080");
});

 

// book.js

const express = require("express");
const router = express.Router();

router.get("/", (req, res, next) => {
  res.send("book page");
});

module.exports = router;

여러개의 미들웨어를 동시에 적용할 수 있다. 전달된 인자의 순서 순으로 동작

 

오류처리 미들웨어

일반적으로 가장 마지막에 위치하는 미들웨어

err, req, res, next 4개의 인자를 가지며 next() 함수에 인자가 전달되면 실행된다.

app.use((err, req, res, next) => {
    res.send('Error');
})

이전에 적용된 미들웨어 중 next()에 인자를 넘기는 경우 중간 미들웨어는 뛰어 넘고 오류처리 미들웨어가 바로 실행된다.

 

Refernece

  • 엘리스