요청(request)과 응답(response)의 중간(middle, 미들)에 위치하여 요청과 응답을 조작하여 기능을 추가하거나 나쁜 요청 등을 걸러내는 역할을 수행
app.use(logger('dev'));
app.use
와 함께 사용
첫 번째 인자로 들어오는 함수가 미들웨어
미들웨어는 use
메서드로 app
에 장착
요청이 들어오면 제일 위의 미들웨어부터 순차적으로 거쳐서 라우터에서 클라이언트로 응답을 보냄
라우터와 에러핸들러 또한 미들웨어의 일종이다.
app.use(function(req, res, next) {
console.log(req.url, '저도 미들웨어입니다');
next();
});
app.js에 위와같은 함수 형태로 미들웨어를 추가한 후, npm start
를 실행한 후 http://localhost:3000 에 접속하면 콘솔에 다음과 같이 기록
$ npm start
/ 저도 미들웨어입니다
GET / 200 271.977 ms - 170
/stylesheets/style.css 저도 미들웨어입니다
GET /stylesheets/style.css 304 1.770 ms - -
next()
미들웨어의 흐름을 제어하는 핵심적인 함수
미들웨어 내에서 반드시 호출되어야 하며, 이게 있어야 다음 미들웨어로 넘어감
이를 빼면 미들웨어 요청 흐름이 끊겨서 브라우저에서 response를 받아올 수 없음
logger
, express.json
, express.urlencoded
, cookieParser
, express.static
모두 내부적으로 next()를 호출하여 다음 미들웨어로 넘어가도록 함
인자로 route
를 넣으면, 특수한 기능을 함 (⇒ 라우터 공부에서 참고)
route
외의 다른 값이 인자로 들어오면 바로 에러 핸들러로 이동 (들어온 인자가 에러에 대한 내용)
[404 처리 미들웨어]
app.use(function(req, res, next) {
next(createError(404));
});
[에러 핸들러]
// 에러 핸들러
app.use(function(err, req, res, next) {
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
res.status(err.status || 500);
res.render('error');
});
err
매개변수가 추가됨)next()
의 인자가 err
매개변수로 연결됨하나의 app.use
에 여러개의 미들웨어 장착이 가능
app.use(logger('dev'), express.json(), express.urlencoded({ extended: false}),
cookieParser(), express.static(path.join(__dirname, 'public')));
가독성이 좋지 않아 위와 같은 케이스로 사용하는 경우는 많지 않음