미들웨어 특성

김무연·2023년 12월 14일

Backend

목록 보기
35/49
post-thumbnail
app.use(( req, res, next ) => {
	console.log('모든 요청에 실행하고 싶어요');
    next();
})

위 코드에서 정확하게 미들웨어는 use가 아닌 안의 함수 (req, res, next) => { console.log(), next()} 가 미들웨어가 된다.

  • 요청과 응답의 중간에 위치하여 미들웨어
  • app.use(미들웨어)로 장착
  • 위에서 아래로 순서대로 실행됨.
  • 미들웨어는 req, res, next가 매개변수인 함수
  • req: 요청, res: 응답 조작 가능
  • next()로 다음 미들웨어로 넘어감.


app.use((req, res, next) => { // 이런 식으로 미들웨어를 동시에 삽입도 가능
  console.log("모든 요청에 실행하고 싶어요")
  next()
}, (req, res, next) => {
  console.log("모든 요청에 실행하고 싶어요22")
  next()
}, (req, res, next) => {
  console.log("모든 요청에 실행하고 싶어요33")
  next()
})

위 처럼 미들웨어를 여러개 연달아 쓸 수 도 있다.

에러 미들웨어

node는 에러처리를 자동으로 해주기 때문에 밑의 코드처럼 에러가 나면 화면에 바로 저렇게 보이게 된다.

  next()
}, (req, res, next) => {
  throw new Error("에러가 났어요")
})

하지만 사용자입장에서 저런 에러가 화면에 바로 보이는 것은 안 좋기 때문에 에러 처리를 따로 해준다. 이 에러 처리 또한 커스텀하여 에러 미들웨어를 통해 해준다.

app.use((err, req, res, next) => { 
  console.error(err);
  res.send("에러가 발생하였습니다.")
})

에러 미들웨어는 인자 4개를 다 써주어야 함 (생략 불가능)
만약 인자를 하나 빼게 되면 일반 미들웨어가 되어버리니깐 주의!!
왜냐하면 js에서는 인자의 개수에 따라 다른 함수가 되어버리기 때문

404페이지 커스텀 하는법

app.get('/', (req, res) => {
  console.log("렌더링 됬어요")
  res.sendFile(path.join(__dirname, 'index.html'));
});

app.post('/', (req, res) => {
  res.send('hello express');
});

app.get('/about', (req, res) => {
  res.send('hello express');
});

app.use((req, res, next) => {
  res.send('404지롱')
})

위 처럼 모든 요청의 라우터 주소들과 일치하지 않으면 404에러가 뜨는데, 와일드카드나 동적라우팅 처럼 모든페이지 접근 가능한 것이 없으면 404에러가 뜨기 때문에 app.use로 404처리를 해줄 수 있다.

또는

app.use((req, res, next) => {
  res.status(404).send('404지롱')
})

app.use((req, res, next) => {
  res.status(200).send('200 이지롱')
})

위 처럼 res.status(숫자) 로 에러의 숫자일 때 지정도 가능

따라서 특정한 에러가 뜰 때마다 어떠한 행동을 해줄 지 구현 가능!!

해커들이 에러 코드 및 숫자 (400,404,500)을 보고 해당 취약 부분만 집중적으로 팔 수 있으니, 에러일 때 숫자를 무조건 200으로만 보여주게 하는 방법으로 보안을 강화하는 방법도 있음

자주하는 실수

send관련 응답은 한 번만!!

app.get('/', (req, res) => {
  console.log("렌더링 됬어요")
  res.sendFile(path.join(__dirname, 'index.html'));
  res.send('안녕하세요.')
  res.json({ hello: 'mumu'})
});

위 처럼 get과 같은 한 라우터에서 send관련된 것이 두 번 이상 나오면 'Cannot set headers after they are sent to the client' 오류가 남.

추가로 미들웨어도 마찬가지 임

app.use((req, res, next) => { // 이런 식으로 미들웨어를 동시에 삽입도 가능
  console.log("모든 요청에 실행하고 싶어요")
  res.send("똥똥")
})

app.get('/', (req, res) => {
  console.log("렌더링 됬어요")
  res.sendFile(path.join(__dirname, 'index.html'));
});

위 와같이 해도 동일한 에러가 나옴. 즉 미들웨어, 라우터 포함 send는 무조건 하나!

왜냐하면 요청 한번에 응답 한번이 나와야 되는데 여러번 응답을 보내주기 때문에 에러가 나옴

응답 후에 헤드 오류

app.get('/', (req, res) => {
  console.log("렌더링 됬어요")
  res.sendFile(path.join(__dirname, 'index.html'));
  res.writeHead(200, {})
});

위와 같이 이미 응답을 보낸 후에 head를 보내면 오류가 남, 순서가 잘못 됨

그리고 writeHead는 http 식이기 때문에, express 식으로 코드를 바꿔줘야함

res.writeHead => res.setHeaer('Content-Type', 'text/html')

함수종료 오류

app.get('/', (req, res) => {
  res.json({ hello: 'mumu'})
  console.log("aa")
});

위와 같이 하면 console은 실행이 된다. 흔히 res.json이든, send든 응답을 보내주었다 해서 함수가 끝난 것이 아님, return이 아니기 때문에 종료가 아님, 잘 기억해둘 것

profile
Notion에 정리된 공부한 글을 옮겨오는 중입니다... (진행중)

0개의 댓글