Express.js 미들웨어

정재헌·2023년 4월 12일
0

미들웨어에 대해서 좀 더 공부해보기 위해, Express.js 공식문서 내 미들웨어에 대한 설명을 바탕으로 공부해보았다.

Express.js 공식문서 내 설명

Express는 자체적인 최소한의 기능을 갖춘 라우팅 및 미들웨어 웹 프레임워크이며, Express 애플리케이션은 기본적으로 일련의 미들웨어 함수 호출입니다.

  • 미들웨어 함수는 다음과 같은 일을 수행할 수 있다.
  1. 모든 코드를 실행
  2. 요청, 응답 오브젝트에 대한 변경을 실행
  3. 요청, 응답 주기를 종료
  4. 스택 내의 그 다음 미들웨어 함수를 호출

현재의 미들웨어 함수가 요청-응답 주기를 종료하지 않는 경우에는 next()를 호출하여 그 다음 미들웨어 함수에 제어를 전달해야 한다. 그렇지 않으면 해당 요청은 정지된 채로 방치된다.

Express 애플리케이션 내 미들웨어 유형

  • 애플리케이션 레벨 미들웨어
  • 라우터 레벨 미들웨어
  • 오류 처리 미들웨어
  • 기본 제공 미들웨어
  • 써드 파티 미들웨어
  • 애플리케이션 레벨 미들웨어
// 마운트 경로가 없는 미들웨어 함수, 앱이 요청을 수신할 때마다 실행

let app = express();

app.use(function(req, res, next) {
	console.log('Time:', Date.now());
    next();
});
// /user/:id 경로에 마운트되는 미들웨어 함수, /user/:id 경로에 대한 모든 유형의 HTTP 요청에 대해 실행

app.use('/user/:id', function(req, res, next) {
	console.log('Request Type:', req.method);
    next();
});
  • 라우터 레벨 미들웨어
const express = require('express')
const router = express.Router();

const userRouter = require('./userRouter')
const reviewRouter = require('./reviewRouter')
const storeRouter = require('./storeRouter') 

router.use('/users', userRouter)
router.use('/reviews', reviewRouter)
router.use('/stores', storeRouter)

module.exports = router

애플리케이션 레벨 및 라우터 레벨 미들웨어는 선택적인 마운트 경로를 통해 로드할 수 있다. 일련의 미들웨어 함수를 함께 로드할 수도 있으며, 이를 통해 하나의 마운트 위치에 미들웨어 시스템의 하위 스택을 작성할 수 있다.

  • 오류 처리 미들웨어

오류 처리 미들웨어에는 항상 4개의 인수가 필요하다. 어떠한 함수를 오류 처리 미들웨어 함수로 식별하려면 4개의 인수를 제공해야 한다. next 오브젝트를 사용할 필요는 없지만, 시그니처를 유지하기 위해 해당 오브젝트를 지정해야 합니다. 그렇지 않으면 next 오브젝트는 일반적인 미들웨어로 해석되어 오류 처리에 실패하게 됩니다.

const globalErrorHandler = async(err, req, res, next) => {
    console.log(err.stack);

    err.statusCode = err.statusCode || 500;

    res.status(err.statusCode).json({ message: err.message })
}

module.exports = { globalErrorHandler }

이 외에도 기본 제공 미들웨어와 써드 파티 미들웨어가 있다. 4.x 버전 이후의 Express는 더 이상 Connect에 종속되지 않으며 express.static의 실행을 제외하면 이전에 Express와 함께 포함되었던 모든 미들웨어 함수는 이제 별도의 모듈에 포함되어 있다고 한다.

써드 파티 미들웨어는 필요한 기능을 위한 Node.js 모듈을 설치한 후, 애플리케이션 레벨 또는 라우터 레벨에서 해당 모듈을 앱에 로드하는 방식으로 작동한다.

<출처>
https://expressjs.com/ko/guide/using-middleware.html

profile
백엔드 개발자

0개의 댓글