개인공부/Backend

Express 미들웨어란?

somm12 2022. 8. 17. 16:49

개념

미들웨어는 서로 다른 어플리케이션이 서로 통신하는데 사용되는 소프트웨어이다. 즉, 양쪽을 연결하여 데이터를 주고받을 수 있도록 중간에서 매개 역할을 하는 소프트웨어이다.

미들웨어에는 순서이 있는데, 코드의 상단에 있는 것이 먼저 실행되고 하단에 있을 수록 나중에 실행된다. 

주로 하단의 미들웨어의 경우 위쪽 코드에서 next를 쓰느냐에 따라 실행이 될 수 있다.

미들웨어의 종류

  • Application Level
  • Router Level
  • Error 처리
  • 기본 제공
  • Thirdparty 미들웨어

1. Application Level Middleware

주로 app객체의 app.use()나 app.METHOD( app.get, app.post) 함수를 이용해서, 미들웨어를 app 인스턴스에

바인딩하는 미들웨어이다. 경로가 없는 미들웨어 함수는 수신할 때 마다 실행하게 된다.

//경로가 있rh, 다음 미들웨어 함수를 호출함
app.get('/pages/', (req, res, next) => {
  console.log('Time : ', Date.now());
  next();
});

//경로가 없고, 응답을 여기서 끝냄
app.get((req, res, next) => {
  console.log('Not Found');
});

2. Router Level Middleware

express.Router()로 생성할 수 있는 router 인스턴스에 미들웨어가 바인딩되는 것이다. 이외에는

어플리케이션 레벨 미들웨어와 차이가 없다.

router.user() 또는 router.METHOD() 함수를 이용해서 로드할 수 있다.

app.js에 app.use을 통해 등록.

//app.js
const express = require('express');
const app = express();
const pageRouter = ('./routes/pages');
app.use('/pages', pageRouter);

page.js로 가면 router 미들웨어가 있다.

//pages.js
const express = require('express');
const router = express.Router();

router.get('/pages/:id', (req, res, next) => {
  //pages id가 0이면 'regular'가 아닌 'special'로 넘어감
  if (req.params.id == 0) next('route');
  //pages id가 0이 아니라면 'regular'로 넘어감
  else next();
}, (req, res, next) => {
  res.send('regular');
}
});

//pages id가 0일 때 넘어올 미들웨어
router.get('/pages/:id', (req, res, next) => {
  res.send('special');
}

module.exports = router;

next의 용도도 알 수 있다.

 

3. Error 처리 middleware

에러 처리 미들웨어는 (err, req, res, next)를 인자로 받는다. 항상 4개의 매개변수가 필요하다.

//오류의 종류에 상관없이 모든 오류를 잡는 미들웨어
app.get((err, req, res, next) => {
  console.log(err.stack);
  res.status(500).send('Something broke!');
});

 

이 경우는 모든 오류를 잡는 미들웨어 하나이다.

에러마다 다른 에러처리 미들웨어 함수를 정의 할 수 있다. 그래서 catch-all 에러 처리 함수는 오류 처리 미들웨어들 중에서 가장 아래에 있어야한다.

app.get('/pages/:id', (req, res, next) => {
  if (!req.params.id) next(err);
});
// next를 써서 다음 에러 처리 미들웨어로 넘어간다.

4. 기본 제공 미들웨어

express.static 같은 것이다.

app.use(express.static(__dirname + '/public'));

5. Third party 미들웨어

써드파티 미들웨어는 npm에서 설치한 모듈들이 해당이 된다. 즉 따로 설치해야하는 것들이다.

ex) cookie-parser

설치: npm i cookie-parser

const express = require('express');
const app = express();
const cookieParser = require('cookie-parser');

app.use(cookieParser());