이상하고 아름다운 Gateway의 응답

오병진·2022년 10월 28일
0

Nest.js에서 Socket.io를 연결하여 채팅서버 만들기같은건

Nest.js에 관심이 있다면 대부분 해보았을 것이다.

근데 간혹 가다 응답이 안받아지거나 할 때가 있을 것이다.
분명 제대로 return하거나 emit을 했는데 말이다.

rxjs를 이용한 이벤트 기반 코딩을 했다면 더더욱말이다.

socket.on

아래 예시를 보자

@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 메서드를 통해 해당 eventlisten하고 있어야 한다.

socket.on('events', (data) => console.log(data));

socket.emit

그 외로도 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 내부에서 어떻게 다루냐에 따라 받는 법이 달라진다는
흔하디 흔한 이야기

profile
지나가는 사람입니다. 마저 지나갈게요 :D

0개의 댓글