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)
// 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)
@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 Uso | Recomendação | Por quê? |
| Chat / Mensageria | WebSocket | Baixa latência e push bidirecional. |
| Notificações em massa | WebSocket / SSE | Evita que o cliente faça polling infinito. |
| Cadastro de Usuário | REST | Processo linear, sem necessidade de canal aberto. |
| Dashboard de Ações | WebSocket | Atualizações precisam ser instantâneas. |
O que acontece por baixo dos panos?
Ao subir um Gateway, o NestJS:
- Instancia o Servidor: Ele sobe o engine do Socket.io automaticamente integrado ao ciclo de vida da aplicação.
- Mapeia Eventos: O decorator
@SubscribeMessagefunciona como um roteador de eventos. Quando o evento chega, o Nest despacha para o método correto. - Gerencia Conexões: Através dos hooks
OnGatewayConnectioneOnGatewayDisconnect, 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.