노드숙련_4

·2022년 12월 20일
0

미들웨어

  • request를 보낸 데이터가 미들웨어를 거치고 난 뒤에 앱으로 전달된다.

  • 모든 요청에 대해 공통적인 처리를 하고 싶은 경우
    => 미들웨어를 통해 로깅사용자 인증을 관리
    => 중복되는 코드를 줄일 수 있음

로깅
모든 요청에 대해서 로그를 남겨 확인하고 싶은 경우
사용자 인증
승인된 사용자만 API를 접근할 수 있게 만들고 싶을 경우

  • 웹 서버의 요청/응답에 대해 공통적으로 관리가 가능

  • 브라우저가 보낸 데이터를 쉽게 사용할 수 있게 바꿔주는 경우 ex) body parser, cookie parser

다른 웹 서버

Apache, Nginx => 모듈이라는 개념을 가지고 있음

  • HTTPS를 지원하기 위해서 https 모듈 추가
  • 모든 요청과 응답을 기록하기 위해 로깅을 해주는 모듈 추가

Express.js

app.use(express.urlencoded({ extended: false }));
app.use(express.json());
  • urlencoded: form-urlencoded 라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있게 도와주는 미들웨어
  • json: JSON 이라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있게 도와주는 미들웨어

미들웨어 작성

app.use((req, res, next) => {
  // 필요한 코드
});

  • req: 요청(Request)에 대한 정보가 담겨있는 객체입니다.
    • HTTP Headers, Query Parameters, URL 등 브라우저가 서버로 보내는 정보들이 담겨있습니다.
  • res: 응답(Response)을 위한 기능이 제공됩니다.
    • 어떤 HTTP Status Code로 응답 할지, 어떤 데이터 형식으로 응답 할지, 헤더는 어떤 값을 넣어 응답 할지 다양한 기능을 제공합니다.
  • next: 다음 스택으로 정의된 미들웨어를 호출합니다.

Request 로그 남기는 미들웨어 작성

app.use((req, res, next) => {
    console.log('Request URL:', req.originalUrl, ' - ', new Date());
    next();
});

bodyparserrouter를 연결하는 사이에 작성되어야 함

여러개의 미들웨어가 겹치는 경우 동작하는 방식

  • 첫번째 미들웨어부터 순차적으로 진입
app.use((req, res, next) => {
    console.log('첫번째 미들웨어');
    next();
});

app.use((req, res, next) => {
    console.log('두번째 미들웨어');
    next();
});

app.use((req, res, next) => {
    console.log('세번째 미들웨어');
    next();
});

// 첫번째 미들웨어
// 두번째 미들웨어
// 세번째 미들웨어
  • 순차적으로 미들웨어를 통과하고 중간에 응답을해서 종료가 되거나 다음 미들웨어로 넘어가서 터미널에 첫번째 미들웨어라는 로그부터 차례대로 세번째 미들웨어까지 출력

  • 하지만 중간에 미들웨어에 next() 가 실행되지 않으면 다음 미들웨어는 실행되지 않음

Router와 미들웨어의 차이

  • Router와 미들웨어는 서로 다른 방식처럼 보이지만
    Router는 미들웨어 기반으로 구현된 객체이므로
    미들웨어와 동일한 방식으로 작동
// 상품 목록 조회 API
  router.get("/goods",
  (req, res, next) => {
    console.log('/goods 미들웨어');
    next();
  },
  (req,res) => {
    res.status(200).json({goods})
  });

Express.js의 미들웨어가 실행되는 경우

app.use(Middleware) : 모든 요청에서 미들웨어가 실행된다.

app.use(’/api’, Middleware) : api로 시작하는 요청에서 미들웨어를 실행한다.

app.post(’/api’, Middleware) : api로 시작하는 POST 요청에서 미들웨어를 실행한다.

profile
개발자가 되는 과정

0개의 댓글