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

    2023. 4. 6.

    by. 지은이: 김지은

    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

    • 엘리스

    댓글