socket 서버가 node에서 발생하는 에러 객체를 읽지를 못해서 string으로 변환하면 읽을 수는 있는데 그러면 에러로 보질 않아서 저희 쪽에서 에러를 커스텀한 후 에러에 대한 status랑 message만 골라서 프론트로 emit 하도록 했습니다.
GameProvider에서 에러가 생길 수 있는 상황마다 직접 커스텀해서 throw 하도록 작업했습니다. throw 되면 socket.on 안에 있는 콜백에 try catch 에서 잡아서 socket.emit('error') 로 프론트에게 에러에 대한 내용을 emit 합니다.
프론트에서 각 페이지마다 error 이벤트 메세지를 받게 되면 상황에 맞는 페이지로 변환할 수 있도록 다시 맞춰야될 것 같습니다.
socket.on('voteSpy', async (roomNum, nickname) => {
try {
await GameProvider.getSpy(roomNum);
socket.voteSpy = nickname;
} catch (err) {
socket.emit('error', (err.statusCode ??= 500), err.message); // statusCode는 Error 객체에 없는 속성이여서 명시하지 않은 에러 발생 시 default 값으로 500의 값을 부여했습니다.
}
});
2. exception.js 를 이용해서 Error 핸들링
GameProvider 내에서 발생하는 에러에 대해 SetError 클래스를 이용해서 상황에 맞는 내용과 상태 코드를 넣어 인스턴스로 throw 해서 외부 socket.on 콜백 에서 catch 합니다.
// Error 를 커스텀 하는 class
class SetError extends Error {
constructor(message, statusCode) {
super(message);
this.message = message;
this.statusCode = statusCode;
}
}
// SetError 를 적용한 부분
getSpy = async (roomNum) => {
if (isNaN(roomNum)) {
throw new SetError('유효하지 않은 방 번호 입니다.', 400);
}
return await GameRepo.getSpy(roomNum);
};
3. room-socket.js 에서 socket.on 매개변수로 boolean 값으로 받는 부분을 '1', '0' 으로 수정
이벤트 메세지로 받은 매개변수들이 전부 string으로 변환되서 옵니다. number 값은 변환하면 되는데 boolean 값은 변환하기가 까다로웠습니다. Boolean(voteStatus) 로 해도 문자열 'false' 도 true 로 변환해버려서 프론트한테 얘기해서 넘겨주는 boolean 값을 0과 1로 바꿔서 달라고 전달했습니다.
작업 내용
관련 이슈 : [Test] socket event message 내부 로직에서 발생하는 Error 처리 테스트
1.
error
이벤트 메세지 추가GameProvider
에서 에러가 생길 수 있는 상황마다 직접 커스텀해서 throw 하도록 작업했습니다. throw 되면socket.on
안에 있는 콜백에try catch
에서 잡아서socket.emit('error')
로 프론트에게 에러에 대한 내용을 emit 합니다.error
이벤트 메세지를 받게 되면 상황에 맞는 페이지로 변환할 수 있도록 다시 맞춰야될 것 같습니다.2.
exception.js
를 이용해서 Error 핸들링GameProvider
내에서 발생하는 에러에 대해SetError
클래스를 이용해서 상황에 맞는 내용과 상태 코드를 넣어 인스턴스로 throw 해서 외부socket.on
콜백 에서 catch 합니다.3.
room-socket.js
에서socket.on
매개변수로 boolean 값으로 받는 부분을 '1', '0' 으로 수정Boolean(voteStatus)
로 해도 문자열 'false' 도 true 로 변환해버려서 프론트한테 얘기해서 넘겨주는 boolean 값을 0과 1로 바꿔서 달라고 전달했습니다.