Aplicação de Chat em Tempo Real
Crie uma aplicação simples de chat em tempo real que demonstre a transmissão de mensagens e a funcionalidade de mensagens privadas.
Aplicação de Chat em Tempo Real é uma aula grátis de Node.js Backend Development Bootcamp no CoddyKit. Esta é a aula 6 de 6. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Node.js Backend Development Bootcamp, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Node.js Backend Development Bootcamp inclui 6 aulas no total.
Partes desta aula ainda não foram traduzidas e aparecem em inglês.
What Makes a Chat App Real-time?
Real-time chat applications allow users to send and receive messages instantly, without refreshing their browser.
This is made possible by WebSockets, which provide a persistent, bidirectional communication channel between the client and server.
In this lesson, we'll build a simple chat app with NestJS, demonstrating message broadcasting and private messaging.
Setting Up Our Chat Gateway
In NestJS, a Gateway is a class annotated with @WebSocketGateway() that handles WebSocket connections and messages.
It acts as the entry point for real-time communication. We'll specify a port for our WebSocket server.
import { WebSocketGateway, WebSocketServer } from '@nestjs/websockets';
import { Server } from 'socket.io';
@WebSocketGateway(3001, { cors: true }) // Port 3001, enable CORS
export class ChatGateway {
@WebSocketServer() server: Server; // socket.io server instance
// More logic will go here
}Managing Client Connections
Our gateway needs to know when clients connect and disconnect. We implement OnGatewayConnection and OnGatewayDisconnect interfaces.
This allows us to run logic when a new user joins or leaves the chat.
import {
WebSocketGateway, WebSocketServer,
OnGatewayConnection, OnGatewayDisconnect
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
@WebSocketGateway(3001, { cors: true })
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
handleConnection(client: Socket, ...args: any[]) {
console.log(`Client connected: ${client.id}`);
// You might add client to a list here
}
handleDisconnect(client: Socket) {
console.log(`Client disconnected: ${client.id}`);
// Remove client from any lists
}
}Sending Messages to Everyone
To broadcast a message, we listen for an event (e.g., 'sendMessage') from a client. When received, we use this.server.emit() to send it to ALL connected clients.
The @SubscribeMessage() decorator maps incoming WebSocket messages to handler methods.
import {
WebSocketGateway, WebSocketServer,
OnGatewayConnection, OnGatewayDisconnect,
SubscribeMessage, MessageBody
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
@WebSocketGateway(3001, { cors: true })
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
handleConnection(client: Socket) { /* ... */ }
handleDisconnect(client: Socket) { /* ... */ }
@SubscribeMessage('sendMessage')
handleMessage(@MessageBody() data: { message: string, senderId: string }): void {
console.log(`Message from ${data.senderId}: ${data.message}`);
this.server.emit('receiveMessage', data); // Broadcast to all
}
}Client-side: Basic Chat Interaction
On the client, we use a library like socket.io-client to connect to our NestJS gateway.
We can then emit messages and on events to receive broadcasts.
// index.html (conceptual client-side script)
const socket = io('http://localhost:3001');
socket.on('connect', () => {
console.log('Connected to chat server!');
socket.emit('sendMessage', {
message: 'Hello everyone!',
senderId: 'user123'
});
});
socket.on('receiveMessage', (data) => {
console.log(`New message: ${data.message} from ${data.senderId}`);
// Update chat UI
});Targeting Specific Users (Private Chat)
Broadcasting is great for general announcements, but what about private conversations between two users?
For private messages, we need a way to identify individual clients and send messages only to them, or to a specific group (a 'room').
Identifying Individual Clients
To send private messages, we need to map a user's unique ID (e.g., from their login) to their specific WebSocket connection ID (client.id).
We can store this mapping in a simple object or Map within our gateway.
import {
WebSocketGateway, WebSocketServer,
OnGatewayConnection, OnGatewayDisconnect,
ConnectedSocket
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
@WebSocketGateway(3001, { cors: true })
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
private connectedUsers: Map<string, string> = new Map(); // userId -> socketId
handleConnection(@ConnectedSocket() client: Socket) {
const userId = client.handshake.query.userId as string; // Get user ID from query
if (userId) {
this.connectedUsers.set(userId, client.id);
console.log(`User ${userId} connected with socket ID: ${client.id}`);
} else {
console.log(`Client connected without userId: ${client.id}`);
}
}
handleDisconnect(@ConnectedSocket() client: Socket) {
const userId = [...this.connectedUsers.entries()]
.find(([key, val]) => val === client.id)?.[0];
if (userId) {
this.connectedUsers.delete(userId);
console.log(`User ${userId} disconnected.`);
} else {
console.log(`Client disconnected: ${client.id}`);
}
}
// ... handleMessage for broadcasting ...
}Sending Direct Messages to a User
With our user-to-socket mapping, we can now send messages directly to a target user's socket.
We listen for a 'privateMessage' event, look up the recipient's socket ID, and use this.server.to(socketId).emit().
import {
WebSocketGateway, WebSocketServer,
OnGatewayConnection, OnGatewayDisconnect,
SubscribeMessage, MessageBody
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
@WebSocketGateway(3001, { cors: true })
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
private connectedUsers: Map<string, string> = new Map(); // userId -> socketId
handleConnection(client: Socket) { /* ... */ }
handleDisconnect(client: Socket) { /* ... */ }
@SubscribeMessage('sendMessage')
handleMessage(data: { message: string, senderId: string }): void { /* ... */ }
@SubscribeMessage('privateMessage')
handlePrivateMessage(
@MessageBody() data: { recipientId: string, message: string, senderId: string }
): void {
const recipientSocketId = this.connectedUsers.get(data.recipientId);
if (recipientSocketId) {
this.server.to(recipientSocketId).emit('receivePrivateMessage', {
message: data.message,
senderId: data.senderId
});
console.log(`Private message from ${data.senderId} to ${data.recipientId}`);
} else {
console.log(`Recipient ${data.recipientId} not found or offline.`);
}
}
}Using Rooms for Group Chats
For group chats, or even 1-on-1 chats, Socket.IO rooms are a powerful feature. Clients can 'join' a room, and you can then broadcast messages to that specific room.
client.join('roomName'): Adds a client to a room.this.server.to('roomName').emit(): Sends a message to all clients in that room.
This simplifies managing message distribution for multiple participants.
Distinguishing Message Types
Consider a NestJS chat application. A user sends a message. You want to ensure only a specific group of 5 users (who are all online) receives this message, not everyone connected.
Real-time Chat: Broadcast & Private
In this lesson, you learned to build a basic real-time chat application using NestJS WebSockets.
- We set up a Gateway to handle connections.
- Implemented broadcasting messages to all connected clients.
- Explored private messaging by mapping user IDs to socket IDs.
- Briefly touched on using Socket.IO rooms for efficient group communication.
These concepts are fundamental for creating interactive, real-time features in your applications!
Perguntas Frequentes
A aula “Aplicação de Chat em Tempo Real” é grátis?
Sim — o texto completo de “Aplicação de Chat em Tempo Real” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Node.js Backend Development Bootcamp, atualize para CoddyKit PRO. O curso de Node.js Backend Development Bootcamp inclui 6 aulas no total.
O que vou aprender em “Aplicação de Chat em Tempo Real”?
Crie uma aplicação simples de chat em tempo real que demonstre a transmissão de mensagens e a funcionalidade de mensagens privadas. Você pratica Node.js Backend Development Bootcamp com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Node.js Backend Development Bootcamp?
Nenhuma experiência prévia é necessária. Node.js Backend Development Bootcamp no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 6 de 6.
Quanto tempo leva a aula “Aplicação de Chat em Tempo Real”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Node.js Backend Development Bootcamp?
Sim. Cada aula de Node.js Backend Development Bootcamp inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Introdução aos WebSockets
- WebSockets com NestJS
- Implementação de Socket.IO no Node.js
- Configuração de Gateways
- Criação de uma Aplicação de Conversação em Tempo Real
- Aplicação de Chat em Tempo Real