¡Hey Coders! Bienvenidos a este tutorial de Nestjs en donde aprenderan a implementar Websockets.
NestJS es un framework de backend de Node.js que ha ganado popularidad gracias a su enfoque modular y escalabilidad. En este artículo, exploraremos la integración de WebSockets en aplicaciones NestJS, aprovechando la capacidad de tiempo real que ofrecen. Los WebSockets son fundamentales para construir aplicaciones interactivas y en tiempo real, y NestJS facilita su implementación mediante su arquitectura basada en módulos y su integración con el ecosistema de JavaScript/TypeScript.
Primero, creemos un proyecto de NestJS
Para comenzar con la implementación de WebSockets en un proyecto NestJS, primero debemos crear un nuevo proyecto. Si aún no tienes instalado el CLI de Nest, puedes hacerlo ejecutando el siguiente comando:
npm install -g @nestjs/cli
Luego, creamos un nuevo proyecto NestJS con el siguiente comando:
nest new nest-websockets-project
Este comando generará la estructura básica del proyecto. Ahora, ingresamos al directorio del proyecto:
cd nest-websockets-project
Con nuestro proyecto de NestJS listo, podemos pasar a la siguiente etapa, que implica configurar y habilitar la funcionalidad de WebSockets en nuestra aplicación.
Configuración de WebSockets en NestJS
NestJS ofrece un módulo integrado para trabajar con WebSockets, lo que simplifica en gran medida su implementación. Comencemos instalando la dependencia necesaria:
npm i --save @nestjs/websockets @nestjs/platform-socket.io
A continuación, crearemos un controlador que manejará las conexiones WebSocket. En el directorio src, creamos un nuevo archivo llamado websockets/websocket.gateway.ts:
import { WebSocketGateway, WebSocketServer } from '@nestjs/websockets';
import { Server } from 'socket.io';
@WebSocketGateway({
cors: {
origin: '*',
},
})
export class WebsocketGateway {
@WebSocketServer()
server: Server;
}
Este código define un Gateway de WebSocket básico. Ahora, registremos este gateway en nuestro módulo principal. Crea un archivo websockets/websocket.module.ts con lo siguiente:
import { Module } from '@nestjs/common';
import { WebsocketGateway } from './websocket.gateway';
@Module({
providers: [WebsocketGateway],
})
export class GatewayModule {}
Abre el archivo app.module.ts y agrégalo a la lista de imports:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { GatewayModule } from './websockets/websocket.module';
@Module({
imports: [GatewayModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
Con esto, hemos configurado la infraestructura básica para trabajar con WebSockets en NestJS. En las secciones siguientes, exploraremos cómo manejar eventos, enviar y recibir mensajes, y aprovechar al máximo la capacidad de tiempo real que ofrecen los WebSockets.
De hecho si ejecutar el comando
npm run start:devveras una salida como la siguiente en terminal:[Nest] 21988 - 01/05/2024, 2:01:53 PM LOG [InstanceLoader] GatewayModule dependencies initialized
Manejo de Eventos y Comunicación en Tiempo Real
Ahora que hemos configurado la base para trabajar con WebSockets en NestJS, exploremos cómo manejar eventos y facilitar la comunicación en tiempo real.
Escuchando Eventos
En nuestro websockets/websocket.gateway.ts, definamos un método para manejar eventos de conexión y desconexión:
import {
OnGatewayConnection,
OnGatewayDisconnect,
WebSocketGateway,
WebSocketServer,
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
@WebSocketGateway({
cors: {
origin: '*',
},
})
export class WebsocketGateway
implements OnGatewayConnection, OnGatewayDisconnect
{
@WebSocketServer()
server: Server;
handleConnection(client: Socket) {
console.log('New client connected', client.id);
}
handleDisconnect(client: Socket) {
console.log('Client disconnected', client.id);
}
}
Puedes probar la conexion usando Postman, alli puedes probar los eventos de conexion y desconexion
Enviando y Recibiendo Mensajes
Modifiquemos nuestro websockets/websocket.gateway.ts para manejar la recepción y emisión de mensajes:
@SubscribeMessage('mensaje')
handleMessage(@MessageBody() data: any) {
console.log(data);
}
Luego para enviar un mensaje al resto de clientes puedes usar emit:
@SubscribeMessage('mensaje')
handleMessage(@ConnectedSocket() client: Socket, @MessageBody() data: any) {
console.log(data);
this.server.emit('mensaje', data);
// console.log(client.id);
// client.broadcast.emit('mensaje', data);
}
Puedes usar postman para enviar un texto y tambien un JSON
En este ejemplo, el método handleMessage escucha eventos llamados 'mensaje' y reenvía el mensaje recibido a todos los clientes conectados.
Con estos pasos, hemos establecido la infraestructura básica para trabajar con WebSockets en un proyecto NestJS. Puedes continuar explorando y personalizando tu aplicación para adaptarla a tus necesidades específicas.