Slik bruker du Nest.js unntaksfiltre for å håndtere feil

Nest.js-unntaksfiltre gir en måte å fange opp og håndtere unntak globalt eller per kontroller.

De lar deg sentralisere feilhåndteringslogikk, formatere feilsvar og gi konsistent feilhåndtering på tvers av applikasjonen. Lær om unntaksfiltre og hvordan du bruker dem til å håndtere applikasjonsfeil på riktig måte.

Standard feilhåndtering i Nest.js

Som standard har Nest.js et unntakslag som håndterer eventuelle unntak som applikasjonskoden din ikke håndterer.

Når det oppstår en ubehandlet feil i applikasjonen din, fanger Nest.js opp den og returnerer en 500 intern serverfeil til klienten. JSON-en som Nest.js returnerer i dette tilfellet ser slik ut:

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

Hvis feilobjektet som koden din sender, inneholder en statuskode og en melding, returnerer Nest.js disse verdiene i stedet for standardsvaret.

For å unngå denne generiske oppførselen og sende et mer meningsfullt feilsvar til klienten, må du omhyggelig håndtere alle feilene som kan oppstå i applikasjonen din. Du kan oppnå dette ved å bruke Nest.js» innebygde eller egendefinerte unntaksfiltre.

Opprette et tilpasset unntaksfilter

For å demonstrere prosessen med å lage et tilpasset unntaksfilter, prøv å lage et som vil håndtere alle HTTP-unntak.

Start med en fil kalt http.exception.ts og legg til følgende importer til den:

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

import { Request, Response } from 'express';

Denne importen tjener følgende formål.

  • ExceptionFilter: Dette er et grensesnitt som beskriver implementeringen av et unntaksfilter.
  • Catch: Dette er en dekoratør som markerer en klasse som et Nest-unntaksfilter.
  • ArgumentsHost: Dette grensesnittet gir metoder for å hente argumentene som sendes til en behandler. Den lar deg velge riktig utførelseskontekst (f.eks. HTTP, RPC eller WebSockets) å hente argumenter fra.
  • HttpException: Dette er en klasse som definerer det grunnleggende Nest HTTP-unntaket.
  • Forespørsel og svar: Dette er grensesnittene for henholdsvis et Express.js-forespørsel og et svarobjekt.
  14 kurs i etisk hacking for å bli en sikkerhetsekspert

Deretter oppretter du en klasse, HttpExceptionFilter, som implementerer ExceptionFilter. Merk den med Catch-dekoratøren for å indikere at den håndterer HttpExceptions:

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

Deretter fyller du klassen med denne koden:

 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',
    });
}

Denne kodeblokken henter forespørsels- og svarobjektene fra ArgumentsHost-objektet og trekker ut relevant informasjon fra unntaket. Den returnerer et strukturert JSON-objektsvar, med detaljer om feilen, til klienten.

Bindende unntaksfiltre

Du kan binde et unntaksfilter til en kontroller eller hele applikasjonen din, avhengig av dine behov.

For å binde et unntaksfilter globalt, importer først unntaksfilteret inn i main.ts-filen. Send deretter en forekomst av unntaksfilteret til app.useGlobalFilters-metoden:

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

For å binde et unntak til en kontroller, importer UseFilters-dekoratoren og unntaksfilteret. Annoter kontrollerklassen din med @UseFilters-dekoratoren og send en forekomst av unntaksfilteret som et argument til dekoratøren:

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

Hvor du binder filteret ditt vil avgjøre omfanget av feilhåndteringen. Kontrollerbundne filtre vil kun imøtekomme kontrolleren du har bundet den til, og programbundne filtre vil imøtekomme hele programmet.

  Prøv disse AI Cold Email Writer-verktøyene for å skrive høykonverterende e-poster

Bruk av innebygde unntak for å kaste feil

Nest.js har innebygde unntaksklasser du kan bruke til å kaste feil.

For eksempel kan du kaste 404-statuskodefeil med NotFoundException-klassen:

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

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

Denne kodeblokken bruker en betinget setning for å sjekke om den gitte brukeren eksisterer. Hvis ikke, sender den en 404-feil ved å bruke NotFoundException, og sender en melding som et argument.

Vanlige innebygde unntaksklasser

Andre innebygde unntaksklasser inkluderer, men er ikke begrenset til, følgende.

  • BadRequestException: Kaster et unntak som indikerer en dårlig forespørsel med en statuskode på 400. Du kan bruke dette unntaket når klientens forespørsel er ugyldig eller feilformet, og serveren ikke kan behandle den på grunn av klientens feil. Det innebærer vanligvis at klienten må endre forespørselen for å gjøre den gyldig.
  • UnauthorizedException: Kaster et unntak som indikerer uautorisert tilgang med en statuskode på 401. Du kan bruke dette unntaket når en bruker ikke er autentisert eller mangler de nødvendige tillatelsene for å få tilgang til en ressurs.
  • ForbiddenException: Kaster et unntak som indikerer forbudt tilgang med en statuskode på 403. Du kan bruke dette unntaket når en bruker er autentisert, men ikke autorisert til å utføre en spesifikk handling.
  • RequestTimeoutException: Kaster et unntak som indikerer at forespørselen har gått ut med en statuskode på 408. Du kan bruke dette unntaket når en server avslutter en forespørsel fordi det tok for lang tid å behandle.
  • ConflictException: Kaster et unntak som indikerer en konflikt med en statuskode på 409. Du kan bruke dette unntaket der det er en konflikt mellom klientens forespørsel og den nåværende tilstanden til ressursen, for eksempel når du prøver å opprette en ressurs som allerede eksisterer.
  • InternalServerErrorException: Kaster et unntak som indikerer en intern serverfeil med en statuskode på 500. Du kan bruke dette unntaket når det oppstår en uventet feil på serversiden, noe som indikerer at serveren ikke kan oppfylle forespørselen på grunn av et internt problem.
  ClickUp erstatter mange apper du bruker og sparer penger

Beste praksis for feilhåndtering i Nest.js

Når du håndterer feil i Nest.js, må du huske å bruke unntaksfiltre for å fange opp og håndtere unntak globalt eller per kontroller. Du kan også opprette egendefinerte filtre for bestemte unntakstyper.

Sørg i tillegg for at du bruker de riktige innebygde unntaksklassene for å kaste riktige og meningsfulle feil. Disse fremgangsmåtene kan forbedre påliteligheten til Nest.js-appene dine betydelig.