본문 바로가기

Programming/Node.js

7. 익스프레스 (1) - 미들웨어 [1]

node js logo image

 

 

 

 

미들웨어는 익스프레스의 핵심적인 요소로, '요청'과 '응답'의 중간(middle)에 위치합니다. 요청과 응답을 컨트롤 하여 여러 기능을 추가하거나 관리해주는 역할을 하죠. 

 

미들웨어를 실행하는 가장 기본적인 방식은 app.use(미들웨어)입니다. 여기에 인수로 라우팅 주소를 포함하여 사용하기도 하는데, 간단히 정리하면 아래의 표와 같습니다. 

 

종류 설명
app.use(미들웨어) 모든 요청에서 미들웨어 실행
app.use('/abc', 미들웨어) abc로 시작하는 요청에서 미들웨어 실행
app.post('/abc', 미들웨어) abc로 시작하는 POST 요청에서 미들웨어 실행

 

 

우선 앞선 아티클에서 작성했던 app.js를 미들웨어를 포함하여 수정하고 살펴보겠습니다. 

 

 

[app.js]

 

const express =require('express');
const path = require('path');

const app = express();
app.set('port', process.env.PORT || 3000);

app.use((req, res, next) => {
    console.log('모든 요청에 실행됨');
    next();
});

app.get('/', (req, res, next) => {
    console.log('GET / 요청에서만 실행됨');
    next();
}, (req, res) => {
    throw new Error('에러는 에러 처리용 미들웨어로 전달');
});

app.use((err, req, res, next) => {
    console.error(err);
    res.status(500).send(err.message);
});

app.listen(app.get('port'), () => {
    console.log(app.get('port'), '번 포트에서 대기');
});

 

 

위 파일을 실행하고, localhost:3000으로 접속하면 일단 콘솔에는 아래와 같이 출력됩니다. 

 

/* 출력
3000 번 포트에서 대기
모든 요청에 실행됨
GET / 요청에서만 실행됨
Error: 에러는 에러 처리용 미들웨어로 전달
    at C:\learn-express\app.js:16:11
    ...
모든 요청에 실행됨
*/

 

 

브라우저는 다음과 같이 출력합니다.

 

 

 

· 위 메서드에서 '미들웨어'로 정의된 함수의 매개변수는 기본적으로 (req, res, next)입니다. next라는 매개변수는, 다음 미들웨어로 넘어가기 위한 함수인데 이를 실행하지 않으면 다음으로 넘어가지 않습니다.

· 설명에 나온 것 처럼, 주소를 첫 번째 파라미터에 넣지 않으면 모든 요청에 실행됩니다.

· app.use나 app.get과 같은 라우터에 미들웨어를 여러 개 장착하는 것도 가능합니다. 아래 예제의 app.get이 이에 해당합니다.

· 미들웨어는 기본적으로 위에서 아래 코드 순서대로 실행됩니다.

 

 

위 예제에서는 app.get('/')의 두 번째 미들웨어에서 강제로 에러를 발생시키고, 이 에러는 다음에 있는 에러 처리용 미들웨어로 전달되는 구조입니다. 에러 처리용 미들웨어는 파라미터가 err, req, res, next로 네 개를 반드시 작성해야 합니다(사용하지 않더라도!)

 

err에는 에러에 대한 기본 정보가 담기고, res.status 메서드로 HTTP 상태 코드도 지겅이 가능합니다. 성공은 200이죠. 에러 처리는 기본적으로 가장 아래에 작성하는 것이 일반적입니다.