인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

31street님의 프로필 이미지
31street

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

웹소켓 미들웨어 적용하기

똑같이 했는데 req.session undefined가 뜨네요..

작성

·

570

3

  chat.on('connection', (socket=> {
    console.log('chat 네임스페이스에 접속..');

    const req = socket.request;       ////////////// 이 부분 누락? 복구.. 그래도..

    //console.log('req: ', req);
    const { headers: { referer } } = req;
    console.log('referer: 'referer);   // 추천에 따라 출력해 봄..
    console.log('req.session'req.session);    // req.session undefined????
    // 주소에서 룸id를 추출하는 부분..

    const roomId = referer
    .split('/')[referer.split('/').length - 1]
    .replace(/\?.+/'');

    socket.join(roomId);      ((1))

    // 2. socket.to(방 아이디) 메서드로 특정 방에 데이터를 보낼 수 있음. 조금 전 세션 미들웨어와 Socket.IO를 연결했으므로
    // 웹 소켓에서 세션을 사용할 수 있음. 방에 참여할 때 방에 누군가가 입장했다는 시스템 메시지를 보냄.  
    socket.to(roomId).emit('join', {
      user: 'system',
      chat: `${req.session.color}님이 입장하셨습니다.`,   // TypeError: Cannot read property 'color' of undefined
   });

//////////////////////////////////////////

8005 번 포트에서 대기중

몽고디비 연결 성공

room 네임스페이스에 접속

새로운 room.on 접속:  ::1 h6N5SLM0D46UmyPoAAAB undefined

room 네임스페이스에 접속

새로운 room.on 접속:  ::1 9dyP8hILc4_NIhx_AAAD undefined

check req.sessioh.color..

req.session.color:  #3a7861

room 네임스페이스 접속 해제....

check req.sessioh.color..

Mongoose: rooms.insertOne({ max: 10, _id: ObjectId("5fe9ddab4360bd497033234d"), title: '나', owner: '#3a7861', password: '', createdAt: new Date("Mon, 28 Dec 2020 13:29:15 GMT"), __v: 0}, { session: null })

check req.sessioh.color..

Mongoose: rooms.findOne({ _id: ObjectId("5fe9ddab4360bd497033234d") }, { projection: {} })

Mongoose: chats.find({ room: ObjectId("5fe9ddab4360bd497033234d") }, { sort: { createdAt: 1 }, projection: {} })

req.session.color:  #3a7861

chat 네임스페이스에 접속..

referer:  http://localhost:8005/room/5fe9ddab4360bd497033234d?password=

req.session undefined

      chat: `${req.session.color}님이 입장하셨습니다.`,   // TypeError: Cannot read property 'color' of undefined

                           ^

TypeError: Cannot read property 'color' of undefined

답변 4

3

참고로 제가 해보니까 3버전에서 채팅방 나갈때 쓰이는 socket.adapter.rooms가 Map Object로 되어 있습니다. 값은 Set Object로 되어있고요.

const currentRoom = socket.adapter.rooms.get(roomId);
const userCount = currentRoom ? currentRoom.size : 0;

위와 같이 바꿔주셔야 채팅방 나가기가 정상적으로 돌아갈겁니다. 혹시 제가 잘못 알수도 있으니 틀렸으면 바로 잡아주세요. 

3

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

3버전의 경우는 io.use 대신 이렇게 넣으시면 됩니다.

const wrap = middleware => (socket, next) => middleware(socket.request, {}, next);
chat.use(wrap(cookieParser(process.env.COOKIE_SECRET)));
chat.use(wrap(sessionMiddleware));

1

31street님의 프로필 이미지
31street
질문자

socket.io 버전을 맞추니 되네요... 버전을 맞춘다고 보긴 봤는데... 엄청 헤맸네요.. 감사합니다...

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

socket.js에서 io.use로 세션미들웨어 연결하는 부분 작성하셨나요? 작성하셨다면 혹시 socket.io가 3버전 아닌지 확인하세요. 제 강좌는 2버전 기준입니다.

31street님의 프로필 이미지
31street

작성한 질문수

질문하기