Nest.js에서 Socket.io를 연결하여 채팅서버 만들기같은건
Nest.js에 관심이 있다면 대부분 해보았을 것이다.
근데 간혹 가다 응답이 안받아지거나 할 때가 있을 것이다.
분명 제대로 return하거나 emit을 했는데 말이다.
rxjs를 이용한 이벤트 기반 코딩을 했다면 더더욱말이다.
아래 예시를 보자
@SubscribeMessage('events')
onEvent(@MessageBody() data: unknown): Observable<WsResponse<number>> {
const event = 'events';
const response = [1, 2, 3];
return from(response).pipe(
map(data => ({ event, data })),
);
}
or
@SubscribeMessage('events')
handleEvent(@MessageBody() data: unknown): WsResponse<unknown> {
const event = 'events';
return { event, data };
}
다음과 같은 코드는 return
으로 보냈지만
{ event, data }
쌍이다.
pipe
로 이루어진 Observable
객체는 Nest 내부에서 클라이언트에게 event
기반으로 emit
을 해준다.
물론 { event, data }
쌍도 마찬가지다.
그러기에 Client
측에서는 on
메서드를 통해 해당 event
를 listen
하고 있어야 한다.
socket.on('events', (data) => console.log(data));
그 외로도 Client
측에서 emit
메서드를 통해 값을 보낼 경우에는
서버에서 return
을 통해 값을 보내준다면, listen
하지 않고도 callback
으로 값을 받아줄 수 있다.
@SubscribeMessage('events')
handleEvent(@MessageBody() data: string): string {
return data;
}
---------
socket.emit("events", "Hello", (data) => { console.log(data) });
//expected Hello Hello
소켓의 기본이지만 Nest 내부에서 어떻게 다루냐에 따라 받는 법이 달라진다는
흔하디 흔한 이야기