Jak používat filtry výjimek Nest.js k řešení chyb

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áš aplikační kód nezpracovává.

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 statusCode a zprávu, Nest.js vrátí tyto hodnoty namísto výchozí odpovědi.

Chcete-li se tomuto obecnému chování vyhnout 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.

  Jak přidat kalendář do Outlooku

Začněte se souborem s názvem http.exception.ts a přidejte do něj 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.

  • ExceptionFilter: Toto je rozhraní popisující implementaci filtru výjimek.
  • Catch: 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 handleru. Umožňuje vám vybrat vhodný kontext provádění (např. HTTP, RPC nebo WebSockets), ze kterého chcete argumenty načíst.
  • HttpException: Toto je třída, která definuje základní výjimku Nest HTTP.
  • Request & Response: Toto jsou rozhraní pro objekt požadavku Express.js a objektu odpovědi.

Dále vytvořte třídu HttpExceptionFilter, která implementuje ExceptionFilter. Označte jej pomocí dekorátoru Catch, abyste označili, že zpracovává HttpExceptions:

 @Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {}

Dále naplňte třídu tímto kódem:

 catch(exception: HttpException, host: ArgumentsHost) {
    
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();

    
    const request = ctx.getRequest<Request>();

    
    const status = exception.getStatus();

    
    response.status(status).json({
      statusCode: status,
      timestamp: new Date().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 importujte filtr výjimek do souboru main.ts. Poté předejte instanci vašeho filtru výjimek metodě app.useGlobalFilters:

 
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './exception/http.exception';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  
  app.useGlobalFilters(new HttpExceptionFilter());

  await app.listen(4050);
}

bootstrap();

Chcete-li svázat výjimku s řadičem, importujte dekorátor UseFilters a svůj filtr výjimek. Označte svou třídu ovladače pomocí dekorátoru @UseFilters a předejte instanci vašeho filtru výjimek jako argument dekorátoru:

 @Controller()
@UseFilters(new HttpExceptionFilter())
export class AppController {}

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.

  Jak prodávat věci na Amazonu

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.

Například můžete vyvolat chyby 404 stavového kódu pomocí třídy NotFoundException:

   getUserById(id: number) {
    const user = users.find((user) => user.id === id);

    if (!user) {
      throw new NotFoundException({
        message: `User with id ${id} not found`,
      });
    }
  }

Tento blok kódu používá podmíněný příkaz ke kontrole, zda daný uživatel existuje. Pokud ne, vyvolá chybu 404 pomocí NotFoundException a předá zprávu jako argument.

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í chybný požadavek se stavovým kódem 400. Tuto výjimku můžete použít, když je požadavek klienta neplatný nebo má nesprávný formát 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 označují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 ke zdroji.
  • ForbiddenException: 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 nemá oprávnění k provedení konkrétní akce.
  • RequestTimeoutException: Vyvolá výjimku označují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 označují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 zdroje, například při pokusu o vytvoření zdroje, který již existuje.
  • InternalServerErrorException: Vyvolá výjimku označují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.
  Jak odesílat a kontrolovat hlasové zprávy na Androidu [+5 Apps]

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.