본문 바로가기

Programming/Node.js

7. 익스프레스 (1) - 미들웨어 [9] : 미들웨어의 특성 정리 1

node js logo image

 

 

 

 

 

- 미들웨어는 req, res, next를 파라미터로 갖는 함수로서 app.use / app.get / app.post 등으로 장착합니다. 

- 에러 처리 미들웨어는 예외적으로 err, req, res, next를 파라미터로 가지게 됩니다. 

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

 

 

- 특정한 주소의 요청에만 미들웨어가 실행되게 하려면, 첫 번째 인수로 주소를 넣으면 됩니다. 

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

 

 

- 아래와 같이 동시에 여러 개의 미들웨어를 장착할 수도 있습니다. 

app.use(
    morgan('dev'),
    express.static('/', path.join(__dirname, 'public')),
    expresss.json(),
    express.urlencoded({ extended: false}),
    cookieParser(process.env.COOKIE_SECRET),
);

 

 

- 다음 미들웨어로 넘어가기 위해서는 next( )를 호출해야 합니다.

- 단, 바로 위의 예제는 미들웨어들이 내부적으로 next를 호출해서 작성하지 않는 경우입니다. 

 

- next를 호출하지 않는 미들웨어는 res.send, res.sendFile등의 메서드로 응답을 보내야 합니다. express.stawtic같은 미들웨어는 정적 파일을 제공할 때 next 대신 res.sendFile 메서드로 응답을 보냅니다. 그래서 정적 파일 제공 시 express.json, express.urlencoded, cookieParser 미들웨어는 실행되지 않습니다. 

- 결국 미들웨어 장착 "순서"에 따라서 실행이 안되는 경우도 있습니다. next도 호출하지 않고 응답도 보내지 않으면 클라이언트는 응답을 받지 못하고 하염없이 기다리게 됩니다. 

 

 

 


 

 

 

- next( )에 기본적으로 인수를 넣지 않고 사용하면 다음 미들웨어로 넘어갑니다. 

- next('route')를 사용할 경우 다음 라우터로 넘어갑니다.

- next(err)을 사용할 경우 에러 처리 전용 미들웨어로 넘어가게 됩니다. 위에서 설명했듯, 에러 처리용 미들웨어는 err을 인수로 갖습니다. 

 

- 위의 여러개 미들웨어를 장착한 경우를 순서대로 나열해보면

 

req > morgan > next( ) > static > next( ) > json, urlencoded > next( ) > cookieParser > next( ) > 라우터 > next( ) > 에러 처리 미들웨어 > res가 됩니다.

 

여기서 어디서든 next(err)을 호출하면 에러처리 미들웨어로 넘어가게 되고, next('route')를 실행하는 경우에는 다음 라우터의 미들웨어로 바로 이동하게 됩니다.