[node express] 미들웨어(middleware)

미들웨어(middleware)?

미들웨어란, 특정 기능을 수행하는 함수이다.

미들웨어 함수는 요청 오브젝트(req), 응답 오브젝트 (res), 그리고 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수 대한 액세스 권한을 갖는다. (출처: express 공식 문서)

 

Express 애플리케이션은 다음과 같은 유형의 미들웨어를 사용할 수 있다고 한다.

  • 애플리케이션 레벨 미들웨어
  • 라우터 레벨 미들웨어
  • 오류 처리 미들웨어
  • 기본 제공 미들웨어
  • 써드파티 미들웨어

 

애플리케이션 레벨 미들웨어

app.use 또는 app.GET/POST 함수를 통해 작동하는 미들웨어 함수를 말한다.

const func1 = (req, res, next) => {
    // req.id = 'not_panpan';
    req.id = 'panpan';
    if (req.id === 'panpan') {
        console.log('go to next route...');
        next('route');
    }    
    else next();
};

const func2 = (req, res, next) => {
    res.send('your id is not panpan!');
};

app.get('/', func1, func2);

app.get('/', (req, res) => {
    res.send('maybe your id is panpan!');
});

다음과 같이 특정 상황에서는 func2를 실행하지 않고 다음 라우터로 건너뛸 수도 있다.

 

 

 

라우터 레벨 미들웨어

express.Router() 인스턴스에 바인드된다는 점을 제외하고는 애플리케이션 레벨 미들웨어와 동일하게 동작한다.

 

 

 

 

오류 처리 미들웨어

오류 처리 미들웨어는 반드시 4개의 매개변수(err, req, res, next)를 가져야 한다.

이외의 특징은 동일하며, 주로 에러 페이지를 렌더링하는 데에 사용된다.

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

 

 

 

기본 제공 미들웨어

말 그대로 express에서 기본적으로 제공하는 미들웨어들을 말한다.

대표적인 기본 제공 미들웨어의 예시로는 express.static 함수가 있다.

var options = {
  dotfiles: 'ignore',
  etag: false,
  extensions: ['htm', 'html'],
  index: false,
  maxAge: '1d',
  redirect: false,
  setHeaders: function (res, path, stat) {
    res.set('x-timestamp', Date.now());
  }
}

app.use(express.static('public', options));

 

 

 

써드파티 미들웨어

express 앱에 새로운 기능을 추가하는 미들웨어이다.

별도의 모듈을 설치하여 적용하는 경우가 많으며, 이를 적용할 시 express에서 사용할 수 있는 새로운 메소드들이 생기는 방식으로 동작한다.

대표적인 예시로는 cookie-parser module이 있다.

$ npm install cookie-parser

cookie-parser module을 설치하고 다음과 같이 적용하면 쿠키 분석에 관한 함수들을 사용할 수 있게 된다.

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

// load the cookie-parsing middleware
app.use(cookieParser());