Sådan bruges Nest.js undtagelsesfiltre til at håndtere fejl

Nest.js-undtagelsesfiltre giver mulighed for at opfange og håndtere undtagelser globalt eller pr. controller.

De lader dig centralisere fejlhåndteringslogikken, formatere fejlsvar og give ensartet fejlhåndtering på tværs af din applikation. Lær om undtagelsesfiltre, og hvordan du bruger dem til korrekt håndtering af applikationsfejl.

Standardfejlhåndtering i Nest.js

Som standard har Nest.js et undtagelseslag, der håndterer eventuelle undtagelser, som din applikationskode ikke håndterer.

Når der opstår en uhåndteret fejl i din applikation, fanger Nest.js den og returnerer en 500 intern serverfejl til klienten. Den JSON, som Nest.js returnerer i dette tilfælde, ser sådan ud:

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

Hvis fejlobjektet, som din kode sender, indeholder en statusCode og en meddelelse, returnerer Nest.js disse værdier i stedet for standardsvaret.

For at undgå denne generiske adfærd og sende et mere meningsfuldt fejlsvar til klienten, skal du omhyggeligt håndtere alle de fejl, der kan opstå i din applikation. Du kan opnå dette ved at bruge Nest.js’ indbyggede eller tilpassede undtagelsesfiltre.

Oprettelse af et brugerdefineret undtagelsesfilter

For at demonstrere processen med at oprette et brugerdefineret undtagelsesfilter, prøv at oprette et, der håndterer alle HTTP-undtagelser.

Start med en fil kaldet http.exception.ts og tilføj følgende importer til den:

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

import { Request, Response } from 'express';

Denne import tjener følgende formål.

  • ExceptionFilter: Dette er en grænseflade, der beskriver implementeringen af ​​et undtagelsesfilter.
  • Catch: Dette er en dekoratør, der markerer en klasse som et Nest-undtagelsesfilter.
  • ArgumentsHost: Denne grænseflade giver metoder til at hente de argumenter, der er sendt til en behandler. Det giver dig mulighed for at vælge den passende udførelseskontekst (f.eks. HTTP, RPC eller WebSockets) at hente argumenter fra.
  • HttpException: Dette er en klasse, der definerer den grundlæggende Nest HTTP-undtagelse.
  • Anmodning og svar: Dette er grænsefladerne for henholdsvis et Express.js-anmodnings- og svarobjekt.
  Sikker WordPress med X-Frame-Options & HTTPOnly Cookie

Derefter skal du oprette en klasse, HttpExceptionFilter, der implementerer ExceptionFilter. Anmærk det med Catch-dekoratøren for at angive, at det håndterer HttpExceptions:

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

Udfyld derefter klassen med denne kode:

 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 kodeblok henter anmodnings- og svarobjekterne fra ArgumentsHost-objektet og udtrækker relevant information fra undtagelsen. Det returnerer et struktureret JSON-objektsvar med detaljer om fejlen til klienten.

Bindende undtagelsesfiltre

Du kan binde et undtagelsesfilter til en controller eller hele din applikation, afhængigt af dine behov.

For at binde et undtagelsesfilter globalt skal du først importere undtagelsesfilteret til din main.ts-fil. Send derefter en forekomst af dit undtagelsesfilter til metoden 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();

For at binde en undtagelse til en controller skal du importere UseFilters-dekoratoren og dit undtagelsesfilter. Annoter din controller-klasse med @UseFilters-dekoratøren og send en forekomst af dit undtagelsesfilter som et argument til dekoratøren:

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

Hvor du binder dit filter, bestemmer omfanget af din fejlhåndtering. Controller-bundne filtre henvender sig kun til den controller, du har bundet den til, og applikationsbundne filtre henvender sig til hele applikationen.

  Sådan tilsluttes AirPods til en iPhone

Brug af indbyggede undtagelser til at smide fejl

Nest.js har indbyggede undtagelsesklasser, du kan bruge til at smide fejl.

For eksempel kan du smide 404-statuskodefejl 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 kodeblok bruger en betinget sætning til at kontrollere, om den givne bruger eksisterer. Hvis ikke, kaster den en 404-fejl ved hjælp af NotFoundException og sender en besked som et argument.

Fælles indbyggede undtagelsesklasser

Andre indbyggede undtagelsesklasser inkluderer, men er ikke begrænset til, følgende.

  • BadRequestException: Kaster en undtagelse, der indikerer en dårlig anmodning med en statuskode på 400. Du kan bruge denne undtagelse, når klientens anmodning er ugyldig eller forkert udformet, og serveren ikke kan behandle den på grund af klientens fejl. Det indebærer typisk, at klienten skal ændre anmodningen for at gøre den gyldig.
  • Uautoriseret Undtagelse: Kaster en undtagelse, der indikerer uautoriseret adgang med en statuskode på 401. Du kan bruge denne undtagelse, når en bruger ikke er godkendt eller mangler de nødvendige tilladelser til at få adgang til en ressource.
  • ForbiddenException: Kaster en undtagelse, der angiver forbudt adgang, med en statuskode på 403. Du kan bruge denne undtagelse, når en bruger er godkendt, men ikke autoriseret til at udføre en bestemt handling.
  • RequestTimeoutException: Kaster en undtagelse, der angiver, at anmodningen har timeout med en statuskode på 408. Du kan bruge denne undtagelse, når en server afslutter en anmodning, fordi det tog for lang tid at behandle.
  • ConflictException: Kaster en undtagelse, der indikerer en konflikt med en statuskode på 409. Du kan bruge denne undtagelse, hvor der er en konflikt mellem klientens anmodning og ressourcens aktuelle tilstand, f.eks. når du forsøger at oprette en ressource, der allerede eksisterer.
  • InternalServerErrorException: Kaster en undtagelse, der indikerer en intern serverfejl med en statuskode på 500. Du kan bruge denne undtagelse, når der opstår en uventet fejl på serversiden, hvilket indikerer, at serveren ikke kan opfylde anmodningen på grund af et internt problem.
  Langsomste kvartal for nystartede virksomheder, Cohere annoncerer 270 millioner dollars finansiering, ReadMe er en digital transaktionsstyringssoftware og Google udvidede adgangsnøgler til Workspace og Cloud

Bedste praksis for fejlhåndtering i Nest.js

Når du håndterer fejl i Nest.js, skal du sørge for at bruge undtagelsesfiltre til at fange og håndtere undtagelser globalt eller pr. controller. Du kan også oprette brugerdefinerede filtre til specifikke undtagelsestyper.

Sørg desuden for, at du bruger de passende indbyggede undtagelsesklasser til at kaste korrekte og meningsfulde fejl. Disse fremgangsmåder kan forbedre pålideligheden af ​​dine Nest.js-apps markant.