Las excepciones no controladas pueden causar confusión y frustración. Límpielos con filtros de excepción.
Los filtros de excepciones de Nest.js proporcionan una manera de interceptar y manejar excepciones globalmente o por controlador.
Le permiten centralizar la lógica de manejo de errores, formatear las respuestas de error y proporcionar un manejo de errores consistente en toda su aplicación. Obtenga información sobre los filtros de excepciones y cómo usarlos para manejar adecuadamente los errores de la aplicación.
Manejo de errores predeterminado en Nest.js
De forma predeterminada, Nest.js tiene una capa de excepción que se ocupa de cualquier excepción que el código de su aplicación no maneja.
Cuando ocurre un error no controlado en su aplicación, Nest.js lo detecta y devuelve un error interno del servidor 500 al cliente. El JSON que devuelve Nest.js en este caso se ve así:
{
"statusCode": 500,
"message": "Internal server error"
}
Si el objeto de error que arroja su código contiene un código de estado y un mensaje, Nest.js devolverá esos valores en lugar de la respuesta predeterminada.
Para evitar este comportamiento genérico y enviar una respuesta de error más significativa al cliente, debe manejar diligentemente todos los errores que puedan ocurrir en su aplicación. Puede lograr esto utilizando los filtros de excepción personalizados o integrados de Nest.js.
Crear un filtro de excepción personalizado
Para demostrar el proceso de creación de un filtro de excepciones personalizado, intente crear uno que maneje todas las excepciones HTTP.
Comience con un archivo llamado http.excepción.ts y agregue las siguientes importaciones:
import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';
import { Request, Response } from'express';
Estas importaciones tienen los siguientes propósitos.
- Filtro de excepción: Esta es una interfaz que describe la implementación de un filtro de excepciones.
- Atrapar: Este es un decorador que marca una clase como filtro de excepción de Nest.
- ArgumentosAnfitrión: esta interfaz proporciona métodos para recuperar los argumentos pasados a un controlador. Le permite elegir el contexto de ejecución apropiado (por ejemplo, HTTP, RPC o WebSockets) para recuperar argumentos.
- HttpException: Esta es una clase que define la excepción HTTP de Nest base.
- Pedido & Respuesta: Estas son las interfaces para un objeto de solicitud y respuesta de Express.js, respectivamente.
A continuación, cree una clase, Filtro de excepción Http, que implementa Filtro de excepción. Anótelo con el Atrapar decorador para indicar que maneja HttpExceptions:
@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}
A continuación, complete la clase con este código:
catch(exception: HttpException, host: ArgumentsHost) {
// Get the response object from the arguments host
const ctx = host.switchToHttp();
const response = ctx.getResponse(); // Get the request object from the arguments host
const request = ctx.getRequest(); // Get the status code from the exception
const status = exception.getStatus();
// Send a JSON response using the response object
response.status(status).json({
statusCode: status,
timestamp: newDate().toISOString(),
path: request.url,
message:
exception.message
|| exception.getResponse()['message']
|| 'Internal Server Error',
});
}
Este bloque de código recupera los objetos de solicitud y respuesta del objeto ArgumentsHost y extrae información relevante de la excepción. Devuelve al cliente una respuesta de objeto JSON estructurado, con detalles sobre el error.
Filtros de excepción vinculantes
Puede vincular un filtro de excepción a un controlador o a toda su aplicación, según sus necesidades.
Para vincular un filtro de excepción globalmente, primero importe el filtro de excepción a su principal.ts archivo. Luego, pase una instancia de su filtro de excepción al app.useGlobalFilters método:
// main.ts
import { NestFactory } from'@nestjs/core';
import { AppModule } from'./app.module';
import { HttpExceptionFilter } from'./exception/http.exception';asyncfunctionbootstrap() {
const app = await NestFactory.create(AppModule);// Bind filter to the application
app.useGlobalFilters(new HttpExceptionFilter());await app.listen(4050);
}
bootstrap();
Para vincular una excepción a un controlador, importe el Usar filtros decorador y su filtro de excepción. Anota tu clase de controlador con el @UseFilters decorador y pase una instancia de su filtro de excepción como argumento al decorador:
@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}
El lugar donde vincule su filtro determinará el alcance de su manejo de errores. Los filtros vinculados al controlador solo atenderán al controlador al que lo vinculó, y los filtros vinculados a la aplicación atenderán a toda la aplicación.
Uso de excepciones integradas para generar errores
Nest.js proporciona clases de excepción integradas que puedes usar para generar errores.
Por ejemplo, puedes tirar 404 errores de código de estado con el Excepción no encontrada clase:
getUserById(id: number) {
const user = users.find((user) => user.id id);
if (!user) {
thrownew NotFoundException({
message: `User with id ${id} not found`,
});
}
}
Este bloque de código utiliza una declaración condicional para comprobar si el usuario dado existe. Si no, arroja un error 404 usando el Excepción no encontrada, pasando un mensaje como argumento.
Clases de excepción integradas comunes
Otras clases de excepción integradas incluyen, entre otras, las siguientes.
- Excepción de solicitud incorrecta: Lanza una excepción que indica una solicitud incorrecta con un código de estado de 400. Puede utilizar esta excepción cuando la solicitud del cliente no es válida o tiene un formato incorrecto y el servidor no puede procesarla debido a un error del cliente. Por lo general, implica que el cliente necesita modificar la solicitud para que sea válida.
- Excepción no autorizada: Lanza una excepción que indica acceso no autorizado con un código de estado de 401. Puede utilizar esta excepción cuando un usuario no está autenticado o carece de los permisos necesarios para acceder a un recurso.
- Excepción prohibida: Lanza una excepción que indica acceso prohibido con un código de estado de 403. Puede utilizar esta excepción cuando un usuario es autenticado pero no autorizado para realizar una acción específica.
- Solicitud de excepción de tiempo de espera: Lanza una excepción que indica que se agotó el tiempo de espera de la solicitud con un código de estado de 408. Puede utilizar esta excepción cuando un servidor finaliza una solicitud porque tardó demasiado en procesarse.
- Excepción de conflicto: Lanza una excepción que indica un conflicto con un código de estado de 409. Puede utilizar esta excepción cuando exista un conflicto entre la solicitud del cliente y el estado actual del recurso, como cuando se intenta crear un recurso que ya existe.
- Excepción de error del servidor interno: Lanza una excepción que indica un error interno del servidor con un código de estado de 500. Puede utilizar esta excepción cuando se produce un error inesperado en el lado del servidor, lo que indica que el servidor no puede cumplir con la solicitud debido a un problema interno.
Mejores prácticas para el manejo de errores en Nest.js
Al manejar errores en Nest.js, asegúrese de usar filtros de excepciones para detectar y manejar excepciones globalmente o por controlador. También puede crear filtros personalizados para tipos de excepción específicos.
Además, asegúrese de utilizar las clases de excepción integradas adecuadas para generar errores adecuados y significativos. Estas prácticas pueden mejorar significativamente la confiabilidad de tus aplicaciones Nest.js.