inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

해결된 질문

266

이태희

작성한 질문수 18

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}님이 퇴장하셨습니다.`,
                });
            }
        });
    });
};

Sequelize nodejs mysql mongodb

답변 2

1

제로초(조현영)

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

0

제로초(조현영)

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

socket.io 3버전을 쓰려면

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

참고하세요.

리눅스 노드 설치시 패키지

0

159

0

socket.js 에서 referer로부터 roomId를 가져올 때

0

905

3

스트리밍 방식으로 대용량 파일 업로드 & 다운로드 관련 질문

0

2281

2

a[title] 질문드립니다

0

375

1

리뉴얼 강의 및 공부 방법

0

581

1

jwt decode

0

1128

1

node.js 교과서 3판 질문드립니다

0

391

1

passport와 jwt

0

432

1

리뉴얼 강의

0

417

2

혹시 Node.js 교과서 3판 이북은 언제 나오나요?

0

353

1

몽고디비 사용자도 MYSQL부분을 들어야 하나요???

0

481

1

sql 쿼리 로그는 어떤 모듈이 작성하나요?

0

505

2

nunjucks res.render('error'); 작동을 안합니다.

0

511

1

질문있습니다.

0

346

1

multer 한글 파일 업로드시 파일명이 깨져요.

1

3535

1

수업자료는 어디있나요?

0

366

1

질문 있습니디

0

235

1

multer 사용시 file 외 name값은 못받나용?

0

416

1

코드 중복 부분 질문드립니다.

0

298

1

api 만드는 이유 질문드립니다.

0

286

1

Strategy의 done에 대해 질문드립니다.

0

361

1

안녕하세요 fs 권한 관련 질문드립니다

0

446

1

시퀄라이즈 연결질문...

0

492

2

res.setHeader vs res.cookie

0

1785

3