Neošetřené výjimky mohou způsobit zmatek a frustraci. Vyčistěte je pomocí filtrů výjimek.
Filtry výjimek Nest.js poskytují způsob, jak zachytit a zpracovat výjimky globálně nebo na základě jednotlivých řadičů.
Umožňují centralizovat logiku zpracování chyb, formátovat chybové odpovědi a poskytovat konzistentní zpracování chyb v celé aplikaci. Přečtěte si o filtrech výjimek a o tom, jak je používat ke správnému zpracování chyb aplikací.
Výchozí zpracování chyb v Nest.js
Ve výchozím nastavení má Nest.js vrstvu výjimek, která se zabývá všemi výjimkami, které váš kód aplikace nezvládá.
Když ve vaší aplikaci dojde k neošetřené chybě, Nest.js ji zachytí a vrátí klientovi interní chybu serveru 500. JSON, který Nest.js vrací v tomto případě, vypadá takto:
{
"statusCode": 500,
"message": "Internal server error"
}
Pokud chybový objekt, který váš kód vyvolá, obsahuje a stavový kód a a zprávaNest.js vrátí tyto hodnoty namísto výchozí odpovědi.
Chcete-li se vyhnout tomuto obecnému chování a odeslat klientovi smysluplnější chybovou odpověď, musíte pečlivě zpracovat všechny chyby, které se mohou ve vaší aplikaci vyskytnout. Můžete toho dosáhnout pomocí vestavěných nebo vlastních filtrů výjimek Nest.js.
Vytvoření vlastního filtru výjimek
Chcete-li předvést proces vytváření vlastního filtru výjimek, zkuste vytvořit takový, který bude zpracovávat všechny výjimky HTTP.
Začněte se souborem s názvem http.exception.ts a přidejte k němu následující importy:
import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';
import { Request, Response } from'express';
Tyto dovozy slouží k následujícím účelům.
- Filtr výjimek: Toto je rozhraní popisující implementaci filtru výjimek.
- Chytit: Toto je dekorátor, který označí třídu jako filtr výjimek Nest.
- ArgumentsHost: Toto rozhraní poskytuje metody pro získávání argumentů předávaných obsluze. Umožňuje vám vybrat vhodný kontext provádění (např. HTTP, RPC nebo WebSockets), ze kterého chcete argumenty načíst.
- Výjimka HTTP: Toto je třída, která definuje základní výjimku Nest HTTP.
- Žádost & Odezva: Toto jsou rozhraní pro objekt požadavku Express.js a objekt odpovědi.
Dále vytvořte třídu, HttpExceptionFilter, která implementuje Filtr výjimek. Okomentujte jej pomocí Chytit dekoratér, který označuje, že zpracovává výjimky Http:
@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}
Dále naplňte třídu tímto kódem:
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',
});
}
Tento blok kódu načte objekty požadavku a odpovědi z objektu ArgumentsHost a extrahuje relevantní informace z výjimky. Klientovi vrátí strukturovanou odpověď objektu JSON s podrobnostmi o chybě.
Vazba filtrů výjimek
Filtr výjimek můžete svázat s řadičem nebo celou aplikací, v závislosti na vašich potřebách.
Chcete-li globálně svázat filtr výjimek, nejprve filtr výjimek importujte do svého main.ts soubor. Poté předejte instanci vašeho filtru výjimek do app.useGlobalFilters metoda:
// 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();
Chcete-li svázat výjimku s řadičem, importujte soubor UseFilters dekoratér a váš filtr výjimek. Označte svou třídu ovladače pomocí @UseFilters dekoratér a předejte instanci vašeho filtru výjimek jako argument dekorátoru:
@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}
Kde navážete svůj filtr, určí rozsah vašeho zpracování chyb. Filtry vázané na řadič se budou starat pouze o řadič, ke kterému je navázán, a filtry vázané na aplikaci se budou věnovat celé aplikaci.
Použití vestavěných výjimek k vyvolání chyb
Nest.js poskytuje vestavěné třídy výjimek, které můžete použít k vyvolání chyb.
Můžete například hodit 404 chyby stavového kódu s NotFoundException třída:
getUserById(id: number) {
const user = users.find((user) => user.id id);
if (!user) {
thrownew NotFoundException({
message: `User with id ${id} not found`,
});
}
}
Tento blok kódu používá podmíněné prohlášení zkontrolovat, zda daný uživatel existuje. Pokud ne, vyvolá chybu 404 pomocí NotFoundException, předání zprávy jako argumentu.
Společné vestavěné třídy výjimek
Mezi další vestavěné třídy výjimek patří, ale nejsou omezeny na, následující.
- BadRequestException: Vyvolá výjimku označující špatný požadavek se stavovým kódem 400. Tuto výjimku můžete použít v případě, že je požadavek klienta neplatný nebo nesprávně formátovaný a server jej nemůže zpracovat kvůli chybě klienta. Obvykle to znamená, že klient potřebuje upravit požadavek, aby byl platný.
- UnauthorizedException: Vyvolá výjimku indikující neoprávněný přístup se stavovým kódem 401. Tuto výjimku můžete použít, když uživatel není ověřen nebo postrádá potřebná oprávnění pro přístup k prostředku.
- Zakázaná výjimka: Vyvolá výjimku označující zakázaný přístup se stavovým kódem 403. Tuto výjimku můžete použít, když je uživatel ověřené, ale ne autorizované k provedení konkrétní akce.
- RequestTimeoutException: Vyvolá výjimku indikující, že vypršel časový limit požadavku se stavovým kódem 408. Tuto výjimku můžete použít, když server ukončí požadavek, protože jeho zpracování trvalo příliš dlouho.
- ConflictException: Vyvolá výjimku indikující konflikt se stavovým kódem 409. Tuto výjimku můžete použít v případě konfliktu mezi požadavkem klienta a aktuálním stavem prostředku, například při pokusu o vytvoření prostředku, který již existuje.
- InternalServerErrorException: Vyvolá výjimku indikující interní chybu serveru se stavovým kódem 500. Tuto výjimku můžete použít, když na straně serveru dojde k neočekávané chybě, která značí, že server nemůže splnit požadavek kvůli internímu problému.
Doporučené postupy pro zpracování chyb v Nest.js
Při zpracovávání chyb v Nest.js nezapomeňte použít filtry výjimek k zachycení a zpracování výjimek globálně nebo pro jednotlivé ovladače. Můžete také vytvořit vlastní filtry pro konkrétní typy výjimek.
Kromě toho se ujistěte, že používáte vhodné vestavěné třídy výjimek k vyvolání správných a smysluplných chyb. Tyto postupy mohou výrazně zlepšit spolehlivost vašich aplikací Nest.js.