본문 바로가기

카테고리 없음

[섹션 5] 미들웨어 알아보기

익스프레스는 미들웨어로 구성이 된다. 라우터에 있는 콜백함수도 미들웨어이다

 

app.use(미들웨어)를 하게 되면 모든 라우터에서 해당 미들웨어가 실행이 된다.

 

또한 app.use(경로, 미들웨어) 하게되면 특정 경로에서만 해당 과정을 거치게 된다. 지금 딱 생각이 나는 거는 유료 칼럼 플랫폼에서 결제한 사람을 체크할 때 쓰면 유용할 것 같다.

 

 

 

미들웨어는 next가 필요하다

app.use((req, res, next) =>{
  console.log('all');
  next(); //next가 있어야 다음 미들웨어나 라우터로 넘어갈 수 있다
});

 

next가 없다면 다음 미들웨어나 라우터로 넘어가지 않는다. 그래서 꼭 next()를 써줘야 한다.

 

 

 

 

라우터 매개변수

app.get('notice/:id', (req, res) =>{
  console.log(req.params.id);
});

 

react를 사용할 때 많이 보던 방법이다. 주로 게시물이나, 카테고리가 여러개로 나뉘는 곳들에서 쓰인다. 매개변수를 사용한 라우터는 보통 다른 라우터들보다 밑에 위치해야 한다. notice/OOO 이라면 모두 위의 구문에 걸리기 때문이다. (위에서 아래로 실행되는 것 잊지 말기)

 

매개변수를 사용하는 것보다 더 넓은 범위는 경로에 '*'를 사용하는 것이다. css에서도 *를 쓰면 모든 곳에 다 적용되는데 익스프레스에서도 그렇게 쓰이나보다. 언제 쓸 수 있을까? 사실 아묻따 전체 범위에 사용할만한 게 아직 생각이 나지 않는다.

 

 

 

에러 처리 미들웨어

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

 

에러 처리 미들웨어는 코드의 맨 마지막에 넣어준다.

 

그리고 꼭 4개의 매개변수(err, req, res, next)를 모두 써줘야 한다. res.status에는 에러의 코드를 담아서 보낼 수 있는데 번호를 임의로 정해서 보낼 수도 있다. 원래는 500에러지만 공격을 피하기 위해서 다른 번호로 보내는 것이다.

 

 

 

next('route')

app.get('/', (req, res, next) =>{
  console.log('다음 라우터를 찾으세요');
  next('route');
}, (req, res) =>{
  console.log('실행 안됨~');
});

 

next()는 다음 미들웨어로 넘기는 기능이었다. next('route')는 다음 미들웨어가 아니라 다음 라우터를 찾는다. 지금 당장은 아래 코드가 쓸모가 없지만 실무에서는 조건문이 엄청 많아질 것이기 때문에 해당 기능이 유용해질 것 같다.