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.
Dispositivos conectan a endpoints por HTTP, como /users para obtener usuarios.
Los endpoints retornan la información solicitada, como arrays de objetos en formato JSON.
¿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.
Usar variables de entorno: export PORT=4000 seguido de npm run start:dev.
Así puedes verificar que ya no responde por el puerto anterior y sí por el nuevo especificado.
¿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.
En este controller, defines rutas y métodos que manejarán las peticiones de los clientes.
¿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:
Así, un array de usuarios deberá ajustarse al shape definido.
TypeScript previene inserciones incorrectas y ayuda a evitar errores comunes.
¿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.
El controller usa decoradores para asociar métodos a rutas y protocolos.
NestJS gestiona el formateo a JSON automáticamente, simplificando el desarrollo.
¿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:
Utiliza dos puntos para indicar un parámetro dinámico en la ruta.
El decorador @Param recupera el valor desde la URL y permite buscar en el array de usuarios.
Devuelve solo el usuario correspondiente, en vez de toda la lista.
¿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.
Situaciones con IDs no encontrados deben ser controladas.
Se plantea el reto de cómo manejar estos casos e invitar a buscar soluciones optimizadas para responder errores de forma adecuada.
¿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.
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:
Instalar el paquete:
npm install @nestjs/config
Importar y configurar en app.module.ts:
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')getUserById(@Param('id') id: string){constuser: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:
cierres la terminal,
abras una nueva pestaña/ventana de terminal, o
inicies una nueva sesión SSH,
la variable ya no estará definida a menos que la vuelvas a exportar.
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.
Agrega la exportación a alguno de los archivos de inicio del shell, según el sistema y el shell que uses:
bash:
Para sesiones interactivas de login: ~/.bash_profile o ~/.profile
Para terminales interactivas (no-login): ~/.bashrc
zsh: ~/.zshrc
macOS moderno (zsh por defecto): ~/.zshrc
Para que afecte a todos los usuarios: editar /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