Express는 자체적인 최소한의 기능을 갖춘 라우팅 및 미들웨어 웹 프레임워크이며, Express 애플리케이션은 기본적으로 일련의 미들웨어 함수 호출입니다.
미들웨어 함수는 요청(req), 응답(res), 다음 미들웨어 함수에 대한 액세스 권한(next)를 갖는다.
미들웨어는 요청과 응답의 중간에 위치하여 미들웨어라고 부른다.
라우터와 컨트롤러 또한 미들웨어의 일종이다.
미들웨어 함수가 요청-응답 주기를 종료하지 않으면 next()를 호출하여 다음 미들웨어로 제어를 전달해야 한다.
→ 그렇지 않으면 해당 요청은 대기 상태로 방치됨
// 모든 요청에 대해 미들웨어 적용
app.use(middleware);
// '/url'로 시작하는 주소의 GET 요청에 대해 미들웨어 적용
app.get('/url', middleware, controller);
app.use((req, res, next) => {
// ...
next();
});
app.get('/url', (req, res, next) => {
// ...
next();
}, controller);
app.use((err, req, res, next) => {
...
});
미들웨어는 위에서부터 순서대로 실행되면서 요청과 응답 사이에 여러 기능을 추가할 수 있다.
next라는 매개변수는 다음 미들웨어로 넘어가는 함수이다.
모든 미들웨어가 next()를 호출하는 것이 아니기 때문에, 미들웨어 작성 순서에 따라 특정 미들웨어 다음에 작성된 것들은 실행되지 않을 수 있다.
에러 처리 미들웨어는 (err, req, res, next)로 네 개다.
기본적으로 익스프레스가 에러를 처리하지만 실무에서는 직접 에러 처리 미들웨어를 연결하는 것이 좋다.
특별한 경우가 아니면 에러 처리 미들웨어는 가장 아래에 위치하도록 한다.
next 함수에 인수를 넣을 수도 있다.
미들웨어 간에 데이터를 전달하는 방법도 있다. (request-ip의 clientIp)
app.use((req, res, next) => {
req.data = '데이터'; // 꼭 data일 필요는 x, 다른 미들웨어와 겹치지 않도록 조심
next();
});
app.use(requestIp.mw());
app.use((req, res, next) => {
console.log(req.data, clientIp); // 데이터 ${clientIp}
next();
});
미들웨어 안에 미들웨어를 넣는 것이 가능하다.
app.use(미들웨어);
app.use((req, res, next) => {
미들웨어(req, res, next);
});
// 예시
app.use((req, res, next) => {
if (process.env.NODE_ENV === 'production')
morgan('combined')(req, res, next);
} else {
morgan('dev')(req, res, next);
}
});
Express 애플리케이션의 미들웨어 유형
유형별 설명은 아래 링크!