[TIL] 미들웨어의 특성

sunriseGong·2021년 11월 11일
0

미들웨어 함수는 어떤 매개변수를 가지나요?

'에러 처리 미들웨어'만 예외로
err, req, res, next를 매개변수로 가지고

보통 req, res, next를 매개변수로 가집니다.


미들웨어는 어디에 장착하나요?

app.use나 app.get, app.post 등의 라우터에 장착할 수 있습니다.


특정한 주소의 요청에만 미들웨어가 실행되게 하려면?

첫 번째 인수로 주소를 넣으면 됩니다.
ex) app.use( ‘/posts’ , 미들웨어 )


하나의 라우터에 여러 미들웨어를 장착할 수 있나요?


next 함수를 호출해야 하는 경우는 언제인가요?

다음 미들웨어로 넘어가야 할 때
next 함수를 호출 합니다.

내부적으로 next를 호출하는 미들웨어들은
연달아 쓸 수 있습니다.


next 를 호출하지 않을 때 주의사항이 있나요?

다음 미들웨어를 실행 시키지도 않고
응답도 보내지 않으면
클라이언트는 응답을 하염없이 기다리게 됩니다.

그래서
res.send나 res.sendFile 등의 메서드로
필히 응답을 보내야 합니다.


미들웨어는 순서에 영향을 받나요?

네.
미들웨어 장착 순서에 따라
어떤 미들웨어는 실행되지 않을 수도 있습니다.

예를들어
express.static과 같은 미들웨어는
정적 파일을 제공할 때
next 대신 res.sendFile 메서드로 응답을 보냅니다.

따라서 정적 파일을 제공하는 경우
그 다음 미들웨어가 있다면 실행되지 않습니다.


next 함수에 인수가 들어가기도 하나요?

네. next 함수에 인수를 넣을 수도 있습니다.

인수로 ‘route’ 를 넣으면(next(‘route’))
다음 라우터의 미들웨어로 바로 이동하고,

그 외의 인수를 넣는다면
라우터에서 에러 발생시
바로 에러 처리 미들웨어로 이동합니다.
이때의 인수는
에러 처리 미들웨어의 err 매개변수가 됩니다.


미들웨어 간에 데이터를 전달하는 방법은?

  1. req.session 객체 사용하기
    세션을 사용한다면 req.session 객체에 데이터를 넣어도 되지만,
    세션이 유지되는 동안 데이터도 계속 유지된다는 단점이 있습니다.

  2. req 객체 사용하기
    만약 요청이 끝날 때까지만 데이터를 유지하고 싶다면
    req 객체에 데이터를 넣어두면 됩니다.

req.data 에 데이터를 넣었다 가정하면
현재 요청이 처리되는 동안
req.data를 통해 미들웨어 간에 데이터를 공유할 수 있습니다.

새로운 요청이 오면
req.data는 초기화됩니다.

주의사항으로는
속성명이 꼭 data일 필요는 없지만
다른 미들웨어와 겹치지 않아야 합니다.

예를 들어
속성명을 body로 한다면(req.body)
body-parser 미들웨어와 기능이 겹치게 됩니다.


데이터를 저장할 때 req객체와 app.set의 차이점은?

익스프레스에서는
app.set으로
데이터를 저장할 수 있고

app.get 또는 req.app.get으로
어디서든지 데이터를 가져올 수 있습니다.

아래는 사용예시 입니다.

그런데도 app.set을 사용하지 않고
req 객체에 데이터를 넣어서
다음 미들웨어로 전달하는 이유는

app.set은
사용자 개개인의 값을 넣기에 부적합 합니다.
익스프레스에서 전역적으로 사용되기 때문 입니다.
그래서 주로 앱 전체의 설정을 공유할 때
사용됩니다.

req 객체는
요청을 보낸 사용자 개개인에게 귀속되므로
개인의 데이터를 전달하기에 적합 합니다.


기존 미들웨어의 기능을 확장하는 패턴이 있나요?

네.
미들웨어 안에 미들웨어를 넣는 방식의 패턴이 있습니다.

기존 미들웨어의 기능을 확장할 수 있어서 유용합니다.

다음 예시는
조건문에 따라
다른 미들웨어를 적용하는 코드로
분기 처리를 한 것 입니다.

다음 예시는
req, res, next를 매개변수로 가지지 않는
passport 라이브러리에
req, res, next를 사용하기 위해
이 패턴으로 확장한 것입니다.

router.post('/login', isNotLoggedIn, (req, res, next) => { // req, res, next를 사용하기 위해서 미들웨어 확장

    passport.authenticate('local', (err, user, info) => {...})

출처 : https://thebook.io/080229/ch06/02/06/

profile
심심해야 공부하게 된다.

0개의 댓글