TIL

24.09.13 TIL

skyteer0 2024. 9. 13. 20:59

app.use((req, res, next) => {
  console.log('첫번째 미들웨어');
  next();
});

app.use((req, res, next) => {
  console.log('두번째 미들웨어');
  next();
});

app.use((req, res, next) => {
  console.log('세번째 미들웨어');
  res.json({ message: 'Hi' });
});

미들웨어가 다음 미들웨어를 실행하기 위해서는 next가 필요하다
만약 next가 없고 클라이언트에게 response도 전달하지 않는다면
무한정 대기하는 상태가 될 수있다
그렇기에 미들웨어를 작성할때 next를 쓰거나 클라이언트에게
response를 반환하는 작업을 해야한다.

현재 미들웨어에서 응답을 보내는 경우 res.json( )같은 메서드를 호출하는 경우에는
next( )를 호출하면 안된다. 만약 이렇게 되버릴 경우 이미 요청이 종료된 상태에서 다른 미들웨어가 응답을 보내려고 하기 때문에 중복된 요청이 전달되는 문제가 발생 되기도 한다.

 

app.use((req, res, next) => {
  console.log('첫번째 미들웨어');
  next();
});

app.use((req, res, next) => {
  console.log('두번째 미들웨어');
  next();
});

app.use((req, res, next) => {
  console.log('세번째 미들웨어');
  res.json({ message: 'Hi' });
});

 

app.use((req, res, next) => {
  console.log('네번째 미들웨어');

  res.json({ message: 'Hi' });
  next();
});

app.use((req, res, next) => {
  console.log('다섯번째 미들웨어');
  next();
});

 

여기서 미들 웨어의 순서는 위에서 부터 아래로 순서대로 내려와 콘솔에 첫번째와 두번째 세번째를 출력하고 localhost를 통해서 들어갔을때 {message : 'Hi'}를 보내는 것으로 끝이 난다. 마지막에 res.json();으로 클라이언트에게 responce하는 것으로 끝이 났기 때문.

 

app.use((req, res, next) => {
  console.log('세번째 미들웨어');
  res.json({ message: 'Hi' });

  next();
});

 

만약 이렇게 next가 붙어 있게 되면 어떻게 될까

이렇게 되면 네번째 미들웨어를 콘솔에 출력하겠지만 res.json부분에서 에러를 일으킨다. 이미 앞에서 클라이언트에 request에 대한 responce를 반환했기 때문. 

Express.js에서 미들웨어가 실행되는 경우
1) app.use(Middleware) : 모든 요청에서 미들웨어가 실행된다.
2) app.use('/api', Middleware) :  /api로 시작하는 모든 요청에서 미들웨어를 실행한다.
3) app.post('/api', Middleware, (req, res) => { }) : /api로 시작하는 Post요청에서 미들웨어를 실행한다.

'TIL' 카테고리의 다른 글

24.09.20 TIL  (1) 2024.09.20
24.09.19 TIL  (0) 2024.09.19
24.09.12 TIL  (0) 2024.09.12
24.09.11 TIL  (0) 2024.09.11
24.09.10 TIL  (2) 2024.09.10