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)
async getProduct(@Param('idProduct') idProduct: string): string {
const product = await this.appService.getProducto(idProduct);
if (!product) {
throw new NotFoundException(`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)
async getProduct(@Param('idProduct') idProduct: string): string {
throw new ForbiddenException(`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)
async getProduct(@Param('idProduct') idProduct: string): string {
throw new InternalServerErrorException(`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
import { ..., NotFoundException } from '@nestjs/common';
@Injectable()
export class ProductsService {
...
findOne(id: number) {
const product = this.products.find((item) => item.id === id);
if (!product) {
throw new NotFoundException(`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,
};
return this.products[index];
}
remove(id: number) {
const index = this.products.findIndex((item) => item.id === id);
if (index === -1) {
throw new NotFoundException(`Product #${id} not found`);
}
this.products.splice(index, 1);
return true;
}
}
@Delete(':id')
delete(@Param('id') id: string) {
return this.productsService.remove(+id);
}
Contribución creada por: Kevin Fiorentino.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?