Luis Rosal
John Edwin Torres Martínez
John Edwin Torres Martínez
Diseñar una API REST eficiente es crucial para cualquier aplicación moderna. Aquí descubrirás, paso a paso, cómo crear endpoints en NestJS que permiten exponer y consultar información de usuarios, desde la definición de controladores hasta la correcta gestión de rutas e identificadores dinámicos.
¿Qué es un endpoint y cómo se consume en un backend?
Un endpoint es el punto de acceso donde los clientes, como aplicaciones móviles o web, se conectan mediante el protocolo HTTP para intercambiar datos con el backend. Diferentes dispositivos pueden consumir estos endpoints para acceder a recursos como listados de usuarios o posts. La solicitud se realiza generalmente por rutas específicas según el servicio que se desea obtener.
/users para obtener usuarios.¿Cómo se configura y ejecuta el servidor en un puerto distinto?
Modificar el puerto de una aplicación puede hacerse desde la terminal utilizando variables de entorno o directamente cambiando la configuración. En el caso de proyectos Node.js, como NestJS, puedes correr el servidor en un puerto diferente con:
npm run start:dev --port=4001 para ejecutar en el puerto 4001.export PORT=4000 seguido de npm run start:dev.¿Para qué sirve un controller en NestJS y cómo se crea?
El controller administra el acceso a los endpoints y conecta las rutas HTTP con la lógica de la aplicación. Usando el CLI de NestJS, puedes generar fácilmente nuevos controladores con comandos como:
nest g controller users para crear user.controller.ts, el archivo de pruebas, y actualizar el app.module.ts.¿Cómo se define y utiliza una interfaz en TypeScript para usuarios?
Para aprovechar la verificación de tipos, se recomienda definir una interfaz para los usuarios, por ejemplo:
interface User { id: string; name: string; email: string; }
¿Cómo se expone el endpoint para obtener la lista de usuarios?
Con el decorador adecuado en el controller, puedes exponer un endpoint accesible mediante HTTP GET, por ejemplo GET /users. Retorna la lista completa de usuarios en formato JSON.
¿Cómo se crean endpoints dinámicos para buscar usuarios por ID?
Para devolver información de un usuario específico, se define un endpoint con parámetro, como /users/:id. Así se consulta el usuario cuyo identificador coincida con el recibido:
@Param recupera el valor desde la URL y permite buscar en el array de usuarios.¿Qué ocurre si el usuario consultado no existe?
Si se solicita un ID inexistente, la aplicación actualmente no retorna respuesta o muestra una página en blanco. Es esencial manejar este comportamiento para mejorar la experiencia y robustez del servicio.
¿Te animas a proponer cómo gestionarías los errores cuando el ID del usuario no existe? Tu experiencia y creatividad pueden aportar mucho a la comunidad.
Luis Rosal
John Edwin Torres Martínez
John Edwin Torres Martínez
William Javier Del Valle Meza
Vee Pabuence Vargas
Jhorman Salazar
Francisco Antonio Hernandez Sabatino
Juan David Marin Rodriguez
John Edwin Torres Martínez
Josué Eliezer Gómez Soto
Deyker Gil
Ulqernesh Karvenae
Ulqernesh Karvenae
Etienne Santiago Samboni
Billy Roy Teske Castro
Alejandro Zapata
Juan Diego Mejia Maestre
Alejandro Zapata
edward rodriguez
Gerardo Rubio Camacho
Daniel Lucumi
Estoy siguiendo la clase y me encontré con un problema al intentar usar variables de entorno en mi proyecto de NestJS.
El problema: Mi archivo .env no se estaba leyendo correctamente, aunque estaba ubicado en la raíz del proyecto y tenía el formato correcto:
PORT=3001
La solución: Es necesario instalar y configurar @nestjs/config. Aquí están los pasos que me faltaban:
npm install @nestjs/config
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
}),
// ...otros imports
],
// ...resto del módulo
})
Sin estos pasos, process.env.PORT siempre retorna undefined y la aplicación usa el puerto por defecto.
Espero que esto ayude a otros que tengan el mismo problema.
¡Saludos!
instala la dependencia dotenv y luego importa la en main.ts para que quede global
instala la dependencia dotenv y luego importa la en main.ts para que quede global
Notaron que el comando npm run start:dev --port 4001 no funcionó? sin embargo no entiendo porqué cuando no les funciona algo simplemente editan el video con la corrección en vez de decir "perdón me equivoqué", no tiene nada malo equivocarse, al final somos humanos y todos nos equivocamos, pero lo ideal sería reconocer los errores y no creer que los que vemos los videos no nos vamos a dar cuenta
Mi forma a pesar de ser sencilla pero efectiva al momento de no conseguir ningún dato
Importante: Si estas tratando de buscar por un id de tipo 'number' debes convertirlo manualmente despues de recibirlo ya que en el protocolo http los params son de tipo 'string'.
@Get(':id') findUserById(@Param('id') id: string) { const userId = parseInt(id, 10); return this.users.find((user) => user.id === userId); }
Mi implementacion.
@Get('/:id') getUserById(@Param('id') id: string) { const user: IUser | undefined = this.users.find((user) =>; user.id === id); return user ? user : {}; // Si no existe, retonar objeto vacio }
en los primeros 3 minutos me surgido una duda y comparto aquí la solución por si alguno tiene la misma inquietud del funcionamiento de la shell con el comando export.
¿Qué hace export PORT=4001?
PORT=4001 crea o asigna la variable PORT en el entorno del shell actual (es una variable de shell).export PORT=4001 hace lo mismo y además marca la variable para que sea heredada por los procesos hijo del shell (programas que lances desde esa terminal).
En otras palabras: la variable queda disponible como variable de entorno para los comandos que ejecutes desde esa sesión.¿Es permanente?
No. NO es permanente. export PORT=4001 afecta solo el shell actual y sus procesos hijos mientras esa sesión exista. Cuando:
Además: si ejecutas ese comando dentro de un script (ej. ./script.sh), por defecto el script se ejecuta en un subshell; la exportación afectará al subproceso y sus hijos, pero no al shell padre que lanzó el script.
Cómo volverla "permanente" (para futuras sesiones)
Agrega la exportación a alguno de los archivos de inicio del shell, según el sistema y el shell que uses:
bash:
~/.bash_profile o ~/.profile~/.bashrczsh: ~/.zshrc~/.zshrc/etc/environment (sintaxis depende de la distro) o crear un script en /etc/profile.d/.este es mi script para cuando no existe el usuario:
Importo la dependencia "NotFoundException" y aplico un condicional al response.
A mi no me funciona ejecutar npm run start:dev --port 4001 me lanza un error de "argumento ilegal" y siempre se ejecuta pero con el puerto por default 3000
Mi implementacion corta
@Get(':id') findUserById(@Param('id') id: string) { return this.users.find((user) => String(user.id) === id) || 'User not found' }
Reto
Si quieren formateado automatico del JSON instalen la extencion json-formatter
import { Injectable, NotFoundException } from '@nestjs/common'; import { User } from './user.interface'; @Injectable() export class UsersService { private readonly users: User[] = [ { id: '1', name: 'jane doe', email: 'jane.doe@example.com', }, { id: '2', name: 'john smith', email: 'john.smith@example.com', }, ]; getUsers(): User[] { return this.users; } getUserById(id: string): User { const user = this.users.find((user) => user.id === id); if (!user) { throw new NotFoundException(`User with id ${id} not found`); } return user; } }
Que son los decoradores en POO
Imagina que los decoradores son etiquetas de instrucciones que pegas sobre una clase o un método. No cambian lo que el código hace por dentro, sino que le añaden una "capa" de comportamiento externo, como si le dieras un superpoder extra sin reescribir su ADN.
En NestJS, esto es lo que permite que una simple función se convierta en un endpoint de API. Si pudieras "decorar" tu propia rutina diaria para que ocurra algo automáticamente cada vez que haces algo específico, ¿qué comportamiento le añadirías?
Arrancar proyecto en puerto específico con Powershell:
$env:PORT=4001; npm run start:dev
🚀 NestJS: Diseño de API REST y Endpoints
📌 Conceptos Fundamentales
Endpoint: Punto de acceso (URL) donde los clientes (web/móvil) interactúan con el backend mediante el protocolo HTTP.
Flujo de datos: El cliente solicita una ruta (ej. /users) y el servidor responde generalmente con un JSON.
⚙️ Configuración del Servidor
Para cambiar el puerto de ejecución y evitar conflictos:
Vía comandos: npm run start:dev --port=4001
Vía variables de entorno: Bash
export PORT=4000
npm run start:dev
🎮 El Controlador (Controller)
Es el encargado de manejar las peticiones entrantes y retornar las respuestas al cliente.
Generación automática (CLI): Bash
nest g controller users
Esto crea user.controller.ts, su archivo de pruebas y lo registra en app.module.ts.
🛠️ Definición de Estructura (Interface)
Para garantizar la integridad de los datos en TypeScript:
TypeScript
interface User { id: string; name: string; email: string; }
🛣️ Definición de Endpoints
1. Obtener todos los recursos (GET)
Se utiliza el decorador @Get() para exponer la lista de usuarios.
Ruta: GET /users
Resultado: Array de objetos JSON.
2. Parámetros Dinámicos (GET por ID)
Para buscar un recurso específico se usan los segmentos dinámicos (:id).
Sintaxis en el Controller: TypeScript
```
@Get(':id') findOne(@Param('id') id: string) { // Lógica para buscar el usuario por ID }
@Get(':id')
```
Decorador @Param: Extrae el valor directamente de la URL.
⚠️ Gestión de Errores
Si un ID no existe, el servidor no debe quedar en silencio. Es fundamental implementar validaciones para retornar códigos de estado HTTP adecuados (ej. 404 Not Found) en lugar de respuestas vacías.
En el caso que el id sea un tipo number. Se debe usar ParseIntPipe. Ya que @Param('id') siempre devuelve un string.
@Get(':id') getUserById(@Param('id', ParseIntPipe) id: number): User | undefined { return this.users.find((user) => user.id === id); }
excelentes explicaciones
directo desde el maint.ts
SI tienen problemas instalando
npm i --save @nestjs/config
Mejor usen yarn o pnpm