• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

미들웨어 확장으로 아예 기능이 달라지기도 하는지 질문드리고 싶습니다

22.05.11 13:54 작성 조회수 142

0

강사님 안녕하세요

다음 진도로 넘어가겠다는 말씀을 드리고 dotenv 실습 중이었는데

또 session에서 미들웨어 확장을 한번 시도하다가 아예 기능이 변하는 걸 발견해서 궁금한 점이 생겨서 질문드리고 싶습니다

 

아래에 session을 미들웨어 확장한 코드(빨간색)와 확장하지 않은 코드(초록색)가 있습니다

 

 

위쪽의 확장버전은 세션은 생기지만 로그인이 안되었고

아래쪽의 미확장버전은 세션도 생기고 로그인이 잘되었습니다

 

이유를 분석해봤습니다

session 미들웨어를 확장한 경우

87행 리다이렉션 뒤에 다시 28행으로 가서 세션을 새로 세팅했습니다

그래서 req.session.name 이 소멸되어서 로그인이 안되었습니다

 

 

반면에 session 미들웨어를 확장하지 않은 경우에는

41행의 session 미들웨어는 처음 딱 1번만 호출되고

87행 리다이렉션 다음에 90행 app.get('/') 으로 이동했습니다

그래서 req.session.name이 소멸되지 않았습니다

 

 

 

미들웨어 확장법을 static 가르쳐주실 때 배운 건데 

session 미들웨어도 한번 확장해봤는데,

혹시 제가 잘못 확장한건지 질문드리고 싶습니다

 

구글링도 해봤는데, (req,res,next)=>{미들웨어(req,res,next)} 로 사용하는 것 같아서요

session 미들웨어에서 확장은 금지인지 질문드리고 싶습니다


긴 질문을 읽어주셔서 고맙습니다

답변 1

답변을 작성해보세요.

1

함수의 호출은 리턴값으로 대체된다고 했죠?

session의 리턴 값은 (req, res, next) => { 세션 관련 코드 } 함수입니다.

즉 app.use(session({...}))은 app.use((req, res, next) => { 세션 관련 코드 }) 입니다. session 함수는 처음 한 번만 호출되고 그 다음부터는 (req, res, next) => { 세션 관련 코드 } 함수가 호출됩니다.

그런데

app.use((req, res, next) => {
  session({...})(req, res, next)
});

를 하면

매번 session 함수가 호출됩니다. 그래서 결과가 다르게 나오는 겁니다. session 함수는 한 번만 호출되어야 합니다.

즉, session 미들웨어는 확장하면 작동이 달라집니다.

상세하게 가르쳐주셔서 정말 감사합니다

앞으로는 미들웨어를 확장할 때, 먼저 사용예시들을 검색해보고, 괜찮은 것 같은 미들웨어만 확장하겠습니다