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

이태희님의 프로필 이미지
이태희

작성한 질문수

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

req.session.color를 찾을수없다고 나오네요

해결된 질문

작성

·

196

0

12장 웹소켓 채팅을 구현중인데

req.session.color를 못찾는다고 나옵니다. node 버전은  v14.15.4이구요

TypeError: cannot read property 'color' of undefined 가 나옵니다.

강의처럼 {} 처리도 해보았는데 도 안되네요  문제가 되는 소스 첨부리며 

 `${req.session.color}님이 입장하셨습니다.`

위에 부분에서 오류가 발생합니다.

const SocketIO = require('socket.io');
const axios = require('axios');
const cookieParser = require('cookie-parser');
const cookie = require('cookie-signature');

module.exports = (server, app, sessionMiddleware) => {
    const io = SocketIO(server, { path: '/socket.io' });
    app.set('io', io);
    const room = io.of('/room');
    const chat = io.of('/chat');

    io.use((socket, next) => {
        cookieParser(process.env.COOKIE_SECRET)(socket.request, socket.request.res || {}, next);
        sessionMiddleware(socket.request, socket.request.res || {}, next);
    });

    room.on('connection', (socket) => {
        console.log('room 네임스페이스에 접속');
        socket.on('disconnect', () => {
            console.log('room 네임스페이스 접속 해제');
        });
    });

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

        const { headers : { referer } } = req;
        const roomId = referer
            .split('/')[referer.split('/').length-1]
            .replace(/\?.+/, '');
        socket.join(roomId);
        socket.to(roomId).emit('join', {
            user: 'system',
            chat: `${req.session.color}님이 입장하셨습니다.`,
        });

        socket.on('disconnect', () => {
            console.log('chat 네임스페이스 접속 해제');
            socket.leave(roomId);
            const currentRoom = socket.adapter.rooms[roomId];
            const userCount = currentRoom ? currentRoom.length : 0;
            if (userCount === 0) { // 접속자 수가 0명이면 방 삭제 
                const signedCookie = req.signedCookies['connect.sid'];
                const connectSID = cookies.sign(signedCookie, process.env.COOKIE_SECRET);
                axios.delete(`http://localhost:8005/room/${roomId}`, {
                    headers: {
                        Cookie: `connect.sid=s%3A${connectSID}`,
                    },
                })
                .then(() => {
                    console.log('방 제거 요청 성공');
                })
                .catch((error) => {
                    console.error(error);
                });
            } else {
                socket.to(roomId).emit('exit', {
                    user: 'system',
                    chat: `${req.session.color}님이 퇴장하셨습니다.`,
                });
            }
        });
    });
};

답변 2

1

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

socket.io 2버전을 사용하세요. 3버전이 설치되어 있으실 겁니다.

0

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

io.use 부분이 바뀌었습니다.

socket.io 3버전을 쓰려면

https://github.com/ZeroCho/nodejs-book/issues/160

참고하세요.

이태희님의 프로필 이미지
이태희

작성한 질문수

질문하기