[Node.js] 미들웨어

jaylight·2021년 1월 17일
0

미들웨어

요청(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')));

가독성이 좋지 않아 위와 같은 케이스로 사용하는 경우는 많지 않음

0개의 댓글