- 미들웨어는 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')를 실행하는 경우에는 다음 라우터의 미들웨어로 바로 이동하게 됩니다.
'Programming > Node.js' 카테고리의 다른 글
7. 익스프레스 (1) - 미들웨어 [10] : multer 1 (1) | 2024.09.04 |
---|---|
7. 익스프레스 (1) - 미들웨어 [9] : 미들웨어의 특성 정리 2 (0) | 2024.09.04 |
7. 익스프레스 (1) - 미들웨어 [8] : express-session 2 (2) | 2024.09.01 |
7. 익스프레스 (1) - 미들웨어 [7] : express-session 1 (1) | 2024.08.31 |
7. 익스프레스 (1) - 미들웨어 [6] : cookie-parser (0) | 2024.08.29 |