tastekim / WeAllLie-BE

👀We Are Lie는 보드게임 '스파이 폴' 을 모티브로한 화상채팅으로 진행하는 온라인 보드게임 플랫폼 입니다 !(~2022.12.22)
3 stars 4 forks source link

room 로직 에러 부분 수정 및 설정 파일 수정 #188

Closed tastekim closed 1 year ago

tastekim commented 1 year ago

수정 내용

서버에 임시 수정해서 프론트랑 전부 테스트해보았습니다.\ 기존에 계속 방에 들어오고 나가고 생성하는 과정에서 닉네임이 업데이트가 안되거나 중복되거나 하는 여러 에러들때문에 찾아본 후 다시 수정했습니다.

1. room-socket.js 수정

1-1. createRoom 이벤트 메세지 내용 수정


// 기존 코드
socket.on('createRoom', async (gameMode, roomTitle, nickname) => {
await RoomProvider.createRoom(gameMode, roomTitle, nickname); //roomData 라는 변수에 담아서 뒤에서 계속 사용합니다.
const roomNum = await RoomProvider.getRoomNum(nickname); // roomData._id 로 roomNum을 대체했습니다.
await RoomProvider.enterRoom(roomNum); // roomNum -> roomData._id 로 수정.
await RoomProvider.incMember(roomNum); // 위에 await RoomProvider.createRoom 메소드 안에서 이미 이 로직이 존재합니다.
console.log(roomNum);
socket.roomNum = roomNum;
socket.isReady = false; // false -> 0 으로 수정.
const showRoom = await RoomProvider.getAllRoom();
const createdRoom = await RoomProvider.getRoom(roomNum); // 위에서 roomData 라는 변수에 이미 있기 때문에 대체됩니다.
let currentMember = await RoomProvider.getCurrentMember(roomNum); // roomNum -> roomData._id 로 수정. let -> const 수정.
socket.join(`/gameRoom${roomNum}`);
lobby.sockets.emit('userNickname', currentMember);
socket.emit('createRoom', createdRoom);
lobby.sockets.emit('showRoom', showRoom);
});

// 수정 내용 socket.on('createRoom', async (gameMode, roomTitle, nickname) => { // 생성된 방 정보 객체 const roomData = await RoomProvider.createRoom(gameMode, roomTitle, nickname);

    // 방의 currentCount 1 증가
    await RoomProvider.enterRoom(roomData._id);

    socket.roomNum = roomData._id;
    socket.isReady = 0;
    // 전체 방 리스트
    const showRoom = await RoomProvider.getAllRoom();

    // 유저 닉네임 배열 가져오기
    const currentMember = await RoomProvider.getCurrentMember(roomData._id);

    socket.emit('createRoom', roomData);
    socket.join(`/gameRoom${roomData._id}`);
    lobby.sockets.emit('userNickname', currentMember);
    lobby.sockets.emit('showRoom', showRoom);
});
### 1-2. `leaveRoom` 이벤트 메세지 수정
```javascript
socket.on('leaveRoom', async (roomNum, nickname) => {
        await RoomProvider.leaveRoom(roomNum);
        //const leaveRoom = await RoomProvider.getRoom(roomNum);
        const currentCount = await RoomProvider.getCurrentCount(roomNum);
        socket.roomNum = null; // 여기서 socket.roomNum을 null 로 바꾼 후에 밑에 emit 하는 곳에서,
        if (currentCount > 0 && currentCount < 9) {
            await RoomProvider.decMember(roomNum, nickname);
            const currentMember = await RoomProvider.getCurrentMember(roomNum);
            const getAllRoom = await RoomProvider.getAllRoom();
            socket.emit('leaveRoom' /*, leaveRoom*/);
            lobby.sockets.emit('showRoom', getAllRoom);
            lobby.to(`/gameRoom${socket.roomNum}`).emit('userNickname', currentMember); // null 을 이용해서 emit을 하고있어서 프론트에서 계속 못받고 있었습니다.
        } else if (currentCount <= 0) {
            console.log('방이 삭제 되었습니다.');
            await RoomProvider.deleteRoom(roomNum);
            const getAllRoom = await RoomProvider.getAllRoom();
            socket.emit('leaveRoom');
            lobby.sockets.emit('showRoom', getAllRoom);
        }
    });

2. room-provider.js 수정

2-1. room-provider.js 에서 createRoom 메소드 수정.

// 기존 코드
createRoom = async (gameMode, roomTitle, nickname) => {
        const createRoom = await RoomRepo.createRoom(gameMode, roomTitle, nickname);
        const roomNum = await RoomRepo.getRoomNum(nickname); // createRoom._id 로 roomNum 역할을 대신해서 삭제했습니다.
        await redis.lpush(`currentMember${await RoomRepo.getRoomNum(nickname)}`, nickname); // incMember 라는 메소드에서 rpush로 닉네임을 추가하고 있어서 같은 순서로 push 하게 끔 수정했습니다. 백틱안에 GameRepo 에서 가져오는 것 대신 createRoom._id로 roomNum을 대체했습니다.
        await redis.set(`ready${roomNum}`, 0);
        await redis.set(`readyStatus${await RoomRepo.getRoomNum(nickname)}`, ''); // 백틱안에 내용을 위에와 같은 이유로 createRoom._id로 대체했습니다.
        return createRoom;
    };

// 수정 내용
createRoom = async (gameMode, roomTitle, nickname) => {
        const createRoom = await RoomRepo.createRoom(gameMode, roomTitle, nickname);
        await redis.rpush(`currentMember${createRoom._id}`, nickname);
        await redis.set(`ready${createRoom._id}`, 0);
        await redis.set(`readyStatus${createRoom._id}`, '');
        return createRoom;
    };

2-2. decMember 메소드 내용 수정.

decMember = async (roomNum, nickname) => {
        await redis.lrem(`currentMember${roomNum}`, 1, nickname);
        let currentMember = await redis.lrange(`currentMember${roomNum}`, 0, -1); // 밑에랑 같은 이유로 삭제했습니다.
        return currentMember; // 여기서 하는 return 값을 앞에서 받지를 않고 멤버 명단을 가져오는 로직이 따로 있기 때문에 삭제했습니다.
    };

3. .eslintrc 내용 수정.

"plugins": ["prettier", "jest"] // jest 추가

4. package.json 내용 수정.

  1. 라이브러리가 추가됬습니다. eslint-plugin-jest 를 추가 설치했어서 pull 받을 때 npm install 한번 진행해야 합니다.
  2. script 부분에 "coverage": "jest --coverage" 구문이 추가됬습니다. 윤진님 테스트 코드 작성 때 필요하다고 합니다.