Neošetrené výnimky môžu spôsobiť zmätok a frustráciu. Vyčistite ich pomocou filtrov výnimiek.

Filtre výnimiek Nest.js poskytujú spôsob, ako zachytiť a spracovať výnimky globálne alebo na základe jednotlivých ovládačov.

Umožňujú vám centralizovať logiku spracovania chýb, formátovať odpovede na chyby a poskytovať konzistentné spracovanie chýb vo vašej aplikácii. Získajte informácie o filtroch výnimiek a o tom, ako ich používať na správne spracovanie chýb aplikácií.

Predvolené spracovanie chýb v Nest.js

V predvolenom nastavení má Nest.js vrstvu výnimiek, ktorá sa zaoberá akýmikoľvek výnimkami, ktoré kód vašej aplikácie nezvláda.

Keď sa vo vašej aplikácii vyskytne neošetrená chyba, Nest.js ju zachytí a vráti klientovi internú chybu servera 500. JSON, ktorý Nest.js vracia v tomto prípade vyzerá takto:

{
"statusCode": 500,
"message": "Internal server error"
}

Ak chybový objekt, ktorý váš kód vyvolá, obsahuje a statusCode a a správuNest.js vráti tieto hodnoty namiesto predvolenej odpovede.

Aby ste sa vyhli tomuto všeobecnému správaniu a odoslali klientovi zmysluplnejšiu chybovú odpoveď, musíte dôsledne riešiť všetky chyby, ktoré sa môžu vo vašej aplikácii vyskytnúť. Môžete to dosiahnuť pomocou vstavaných alebo vlastných filtrov výnimiek Nest.js.

instagram viewer

Vytvorenie vlastného filtra výnimiek

Ak chcete demonštrovať proces vytvárania vlastného filtra výnimiek, skúste vytvoriť taký, ktorý bude spracovávať všetky výnimky HTTP.

Začnite so súborom s názvom http.exception.ts a pridajte k nemu nasledujúce importy:

import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';

import { Request, Response } from'express';

Tieto dovozy slúžia na nasledujúce účely.

  • Filter výnimky: Toto je rozhranie popisujúce implementáciu filtra výnimiek.
  • Chytiť: Toto je dekorátor, ktorý označí triedu ako filter výnimky Nest.
  • ArgumentyHost: Toto rozhranie poskytuje metódy na získanie argumentov odovzdaných obslužnému programu. Umožňuje vám vybrať si vhodný kontext vykonávania (napr. HTTP, RPC alebo WebSockets), z ktorého chcete získať argumenty.
  • HttpException: Toto je trieda, ktorá definuje základnú výnimku Nest HTTP.
  • Žiadosť & odpoveď: Toto sú rozhrania pre objekt požiadavky Express.js a objekt odpovede.

Ďalej vytvorte triedu, HttpExceptionFilter, ktorý implementuje Filter výnimky. Označte ho pomocou Chytiť dekoratér na označenie, že spracováva HttpExceptions:

@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}

Ďalej vyplňte triedu týmto kódom:

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číta objekty požiadavky a odpovede z objektu ArgumentsHost a extrahuje relevantné informácie z výnimky. Klientovi vráti štruktúrovanú odpoveď objektu JSON s podrobnosťami o chybe.

Viazanie filtrov výnimiek

Filter výnimiek môžete naviazať na ovládač alebo celú vašu aplikáciu, v závislosti od vašich potrieb.

Ak chcete naviazať filter výnimiek globálne, najprv importujte filter výnimiek do svojho main.ts súbor. Potom odovzdajte inštanciu vášho filtra výnimiek do app.useGlobalFilters metóda:

// 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();

Ak chcete naviazať výnimku na ovládač, importujte súbor UseFilters dekoratér a váš filter výnimiek. Označte svoju triedu ovládačov pomocou @UseFilters dekoratér a odovzdať inštanciu vášho filtra výnimiek ako argument dekorátorovi:

@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}

Miesto, kde naviažete filter, určí rozsah spracovania chýb. Filtre viazané na ovládač budú vyhovovať iba ovládaču, ku ktorému ste ho pripojili, a filtre viazané na aplikáciu sa budú venovať celej aplikácii.

Používanie vstavaných výnimiek na vyvolanie chýb

Nest.js poskytuje vstavané triedy výnimiek, ktoré môžete použiť na vyvolanie chýb.

Môžete napríklad hodiť 404 chyby stavového kódu s NotFoundException trieda:

 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žíva podmienečné vyhlásenie aby ste skontrolovali, či daný používateľ existuje. Ak nie, vyhodí chybu 404 pomocou NotFoundException, odovzdanie správy ako argumentu.

Bežné vstavané triedy výnimiek

Ďalšie vstavané triedy výnimiek zahŕňajú, ale nie sú obmedzené na nasledujúce.

  • BadRequestException: Vyvolá výnimku označujúcu zlú požiadavku so stavovým kódom 400. Túto výnimku môžete použiť, keď je požiadavka klienta neplatná alebo má nesprávny formát a server ju nemôže spracovať z dôvodu chyby klienta. Zvyčajne to znamená, že klient potrebuje upraviť požiadavku, aby bola platná.
  • UnauthorizedException: Vyvolá výnimku označujúcu neoprávnený prístup so stavovým kódom 401. Túto výnimku môžete použiť, keď používateľ nie je overený alebo mu chýbajú potrebné povolenia na prístup k prostriedku.
  • Zakázaná výnimka: Vyvolá výnimku označujúcu zakázaný prístup so stavovým kódom 403. Túto výnimku môžete použiť, keď je používateľ overené, ale neautorizované vykonať konkrétnu akciu.
  • RequestTimeoutException: Vyvolá výnimku označujúcu, že časový limit požiadavky vypršal, so stavovým kódom 408. Túto výnimku môžete použiť, keď server ukončí požiadavku, pretože jej spracovanie trvalo príliš dlho.
  • ConflictException: Vyvolá výnimku označujúcu konflikt so stavovým kódom 409. Túto výnimku môžete použiť v prípade konfliktu medzi požiadavkou klienta a aktuálnym stavom prostriedku, napríklad pri pokuse o vytvorenie prostriedku, ktorý už existuje.
  • InternalServerErrorException: Vyvolá výnimku označujúcu internú chybu servera so stavovým kódom 500. Túto výnimku môžete použiť, keď sa na strane servera vyskytne neočakávaná chyba, ktorá naznačuje, že server nemôže splniť požiadavku z dôvodu interného problému.

Osvedčené postupy na spracovanie chýb v Nest.js

Pri spracovávaní chýb v Nest.js nezabudnite použiť filtre výnimiek na zachytenie a spracovanie výnimiek globálne alebo pre každý ovládač. Môžete tiež vytvoriť vlastné filtre pre konkrétne typy výnimiek.

Okrem toho sa uistite, že používate vhodné vstavané triedy výnimiek na vyvolanie správnych a zmysluplných chýb. Tieto postupy môžu výrazne zlepšiť spoľahlivosť vašich aplikácií Nest.js.