Desarrollar una API correctamente también implica manejar los errores que sus endpoints pueden tener de manera clara para el front-end.
Manejo de errores con NestJS
NestJS implementa de forma muy sencilla la posibilidad de responder con errores al cliente que realiza las consultas. Esto lo hace con una serie de clases que implementan los códigos HTTP correctos dependiendo el tipo de error que necesites.
import{NotFoundException}from'@nestjs/common';@Get('product/:idProduct')@HttpCode(HttpStatus.OK)asyncgetProduct(@Param('idProduct') idProduct: string): string {const product =awaitthis.appService.getProducto(idProduct);if(!product){thrownewNotFoundException(`Producto con ID #${idProduct} no encontrado.`);}return product;}
Importando NotFoundException puedes arrojar un error con la palabra reservada throw indicando que un registro no fue encontrado. Esta excepción cambiará el estado HTTP 200 que envía el decorador @HttpCode(HttpStatus.OK) por un 404 que es el correspondiente para la ocasión.
También puedes lanzar errores cuando el usuario no tiene permisos para acceder a un recurso.
import{ForbiddenException}from'@nestjs/common';@Get('product/:idProduct')@HttpCode(HttpStatus.OK)asyncgetProduct(@Param('idProduct') idProduct: string): string {// ...thrownewForbiddenException(`Acceso prohibido a este recurso.`);}
O incluso lanzar errores de la familia del 5XX cuando ocurre un error inesperado en el servidor.
import{InternalServerErrorException}from'@nestjs/common';@Get('product/:idProduct')@HttpCode(HttpStatus.OK)asyncgetProduct(@Param('idProduct') idProduct: string): string {// ...thrownewInternalServerErrorException(`Ha ocurrido un error inesperado.`);}
Explora todas las clases con estados HTTP que NestJS posee para desarrollar tus endpoints de manera profesional y manejar correctamente los errores.
SRC services
// src/services/products.service.tsimport{...,NotFoundException}from'@nestjs/common';@Injectable()exportclassProductsService{...findOne(id: number){const product =this.products.find((item)=> item.id=== id);if(!product){thrownewNotFoundException(`Product #${id} not found`);}return product;}update(id: number,payload: any){const product =this.findOne(id);const index =this.products.findIndex((item)=> item.id=== id);this.products[index]={...product,...payload,};returnthis.products[index];}remove(id: number){const index =this.products.findIndex((item)=> item.id=== id);if(index ===-1){thrownewNotFoundException(`Product #${id} not found`);}this.products.splice(index,1);returntrue;}}