Se você já tentou implementar WebSockets com Express puro ou Node “na unha”, sabe que o projeto vira um caos em pouco tempo. É um io.on('connection') dentro de outro, eventos espalhados por todo o server e uma dificuldade imensa de injetar dependências. É o oposto do que buscamos em uma arquitetura organizada.

O NestJS resolve isso com o conceito de Gateways. Pense neles como os “Controllers” do mundo em tempo real. Eles encapsulam a lógica de eventos e mantêm o seu back-end limpo e testável.

O Problema: O caos do Socket.io “solto”

Quando não usamos um framework como o Nest, acabamos misturando a lógica de negócio com a infraestrutura do socket.

Ruim: O jeito “tradicional” (difícil de manter)

JavaScript
// server.js
io.on('connection', (socket) => {
  socket.on('chat_message', (msg) => {
    // Lógica de banco, validação e emissão tudo aqui dentro...
    db.save(msg); 
    io.emit('chat_message', msg);
  });
});

A Solução: Gateways no NestJS

No Nest, usamos decorators para mapear mensagens. É muito mais legível e você consegue usar os mesmos princípios de Clean Code que usamos em APIs REST.

Bom: O jeito NestJS (Gateways)

TypeScript
@WebSocketGateway({ cors: { origin: '*' } })
export class ChatGateway {
  @WebSocketServer()
  server: Server;

  @SubscribeMessage('send_message')
  handleMessage(@MessageBody() data: unknown, @ConnectedSocket() client: Socket) {
    // Aqui você pode injetar Services e manter a lógica limpa
    this.server.emit('receive_message', {
      userId: client.id,
      message: data,
    });
  }
}

Quando usar WebSockets vs. REST?

Nem tudo precisa ser em tempo real. Seja pragmático: o custo de manter conexões abertas é maior que uma requisição HTTP simples.

Caso de UsoRecomendaçãoPor quê?
Chat / MensageriaWebSocketBaixa latência e push bidirecional.
Notificações em massaWebSocket / SSEEvita que o cliente faça polling infinito.
Cadastro de UsuárioRESTProcesso linear, sem necessidade de canal aberto.
Dashboard de AçõesWebSocketAtualizações precisam ser instantâneas.

O que acontece por baixo dos panos?

Ao subir um Gateway, o NestJS:

  1. Instancia o Servidor: Ele sobe o engine do Socket.io automaticamente integrado ao ciclo de vida da aplicação.
  2. Mapeia Eventos: O decorator @SubscribeMessage funciona como um roteador de eventos. Quando o evento chega, o Nest despacha para o método correto.
  3. Gerencia Conexões: Através dos hooks OnGatewayConnection e OnGatewayDisconnect, você tem controle total de quem entra e sai, ideal para gerenciar estados de autenticação.

No fim das contas…

Usar Socket.io com NestJS não é “complicar o Node”, é dar estrutura para que seu projeto não morra quando precisar de mais de dois eventos. Com Gateways, você mantém a separação de responsabilidades e consegue escalar sua aplicação em tempo real sem perder o juízo.

Se você já domina o TypeScript básico, abrir um socket no Nest vai parecer tão natural quanto criar uma rota GET.