Le eccezioni non gestite possono causare confusione e frustrazione. Puliscili con i filtri delle eccezioni.
I filtri delle eccezioni Nest.js forniscono un modo per intercettare e gestire le eccezioni a livello globale o in base al controller.
Ti consentono di centralizzare la logica di gestione degli errori, formattare le risposte agli errori e fornire una gestione coerente degli errori in tutta l'applicazione. Informazioni sui filtri delle eccezioni e su come utilizzarli per gestire in modo appropriato gli errori dell'applicazione.
Gestione degli errori predefinita in Nest.js
Per impostazione predefinita, Nest.js dispone di un livello di eccezione che si occupa di eventuali eccezioni non gestite dal codice dell'applicazione.
Quando si verifica un errore non gestito nella tua applicazione, Nest.js lo rileva e restituisce al client un errore interno del server 500. Il JSON restituito da Nest.js in questo caso è simile al seguente:
{
"statusCode": 500,
"message": "Internal server error"
}
Se l'oggetto errore generato dal codice contiene un file
statusCode e un Messaggio, Nest.js restituirà tali valori anziché la risposta predefinita.Per evitare questo comportamento generico e inviare una risposta di errore più significativa al client, è necessario gestire con diligenza tutti gli errori che potrebbero verificarsi nella propria applicazione. Puoi raggiungere questo obiettivo utilizzando i filtri per eccezioni integrati o personalizzati di Nest.js.
Creazione di un filtro eccezioni personalizzato
Per dimostrare il processo di creazione di un filtro per eccezioni personalizzato, prova a crearne uno che gestisca tutte le eccezioni HTTP.
Inizia con un file chiamato http.eccezione.ts e aggiungi le seguenti importazioni:
import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';
import { Request, Response } from'express';
Queste importazioni servono ai seguenti scopi.
- Filtro eccezioni: Questa è un'interfaccia che descrive l'implementazione di un filtro di eccezioni.
- Presa: questo è un decoratore che contrassegna una classe come filtro di eccezioni Nest.
- ArgomentiHost: Questa interfaccia fornisce metodi per recuperare gli argomenti passati a un gestore. Ti consente di scegliere il contesto di esecuzione appropriato (ad esempio, HTTP, RPC o WebSocket) da cui recuperare gli argomenti.
- HttpException: questa è una classe che definisce l'eccezione Nest HTTP di base.
- Richiesta & Risposta: Queste sono le interfacce rispettivamente per una richiesta Express.js e un oggetto risposta.
Quindi, crea una classe, HttpExceptionFilter, che implementa Filtro eccezioni. Annotalo con il Presa decoratore per indicare che gestisce HttpExceptions:
@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}
Successivamente, compila la classe con questo codice:
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',
});
}
Questo blocco di codice recupera gli oggetti di richiesta e risposta dall'oggetto ArgumentsHost ed estrae le informazioni rilevanti dall'eccezione. Restituisce al client una risposta di oggetto JSON strutturata, con i dettagli sull'errore.
Associazione dei filtri delle eccezioni
Puoi associare un filtro delle eccezioni a un controller o all'intera applicazione, a seconda delle tue esigenze.
Per associare un filtro delle eccezioni a livello globale, importa prima il filtro delle eccezioni nel tuo file main.ts file. Quindi, passa un'istanza del filtro delle eccezioni al file app.useGlobalFilters metodo:
// 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();
Per associare un'eccezione a un controller, importare il file Usa filtri decoratore e il filtro delle eccezioni. Annota la tua classe controller con il file @UseFilters decoratore e passa un'istanza del filtro delle eccezioni come argomento al decoratore:
@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}
Il punto in cui colleghi il filtro determinerà l'ambito della gestione degli errori. I filtri associati al controller si occuperanno solo del controller a cui lo hai associato, mentre i filtri associati all'applicazione si occuperanno dell'intera applicazione.
Utilizzo di eccezioni integrate per generare errori
Nest.js fornisce classi di eccezioni integrate che puoi utilizzare per generare errori.
Ad esempio, puoi lanciare 404 errori del codice di stato con il NotFoundException classe:
getUserById(id: number) {
const user = users.find((user) => user.id id);
if (!user) {
thrownew NotFoundException({
message: `User with id ${id} not found`,
});
}
}
Questo blocco di codice utilizza una dichiarazione condizionale per verificare se l'utente specificato esiste. In caso contrario, genera un errore 404 utilizzando il file NotFoundException, passando un messaggio come argomento.
Classi di eccezioni integrate comuni
Altre classi di eccezioni integrate includono, ma non sono limitate a, le seguenti.
- BadRequestException: genera un'eccezione che indica una richiesta errata con un codice di stato di 400. Puoi utilizzare questa eccezione quando la richiesta del client non è valida o non è valida e il server non può elaborarla a causa dell'errore del client. In genere implica che il client debba modificare la richiesta per renderla valida.
- Eccezione non autorizzata: genera un'eccezione che indica l'accesso non autorizzato con un codice di stato di 401. È possibile utilizzare questa eccezione quando un utente non è autenticato o non dispone delle autorizzazioni necessarie per accedere a una risorsa.
- Eccezione proibita: genera un'eccezione che indica l'accesso vietato con un codice di stato di 403. Puoi utilizzare questa eccezione quando un utente lo è autenticato ma non autorizzato per eseguire un'azione specifica.
- RequestTimeoutException: genera un'eccezione che indica che la richiesta è scaduta con un codice di stato di 408. Puoi utilizzare questa eccezione quando un server termina una richiesta perché ha impiegato troppo tempo per l'elaborazione.
- Eccezione conflitto: genera un'eccezione che indica un conflitto con un codice di stato di 409. Puoi utilizzare questa eccezione laddove si verifica un conflitto tra la richiesta del client e lo stato corrente della risorsa, ad esempio quando si tenta di creare una risorsa che già esiste.
- InternalServerErrorException: genera un'eccezione che indica un errore interno del server con un codice di stato di 500. È possibile utilizzare questa eccezione quando si verifica un errore imprevisto sul lato server, che indica che il server non può soddisfare la richiesta a causa di un problema interno.
Best practice per la gestione degli errori in Nest.js
Quando gestisci gli errori in Nest.js, assicurati di utilizzare i filtri delle eccezioni per acquisire e gestire le eccezioni a livello globale o per controller. Puoi anche creare filtri personalizzati per tipi di eccezioni specifici.
Inoltre, assicurati di utilizzare le classi di eccezioni integrate appropriate per generare errori corretti e significativi. Queste pratiche possono migliorare in modo significativo l'affidabilità delle tue app Nest.js.