Nieobsługiwane wyjątki mogą powodować zamieszanie i frustrację. Wyczyść je za pomocą filtrów wyjątków.

Filtry wyjątków Nest.js umożliwiają przechwytywanie i obsługę wyjątków globalnie lub dla poszczególnych kontrolerów.

Umożliwiają centralizację logiki obsługi błędów, formatowanie odpowiedzi na błędy i zapewniają spójną obsługę błędów w całej aplikacji. Dowiedz się o filtrach wyjątków i o tym, jak ich używać, aby odpowiednio obsługiwać błędy aplikacji.

Domyślna obsługa błędów w Nest.js

Domyślnie Nest.js zawiera warstwę wyjątków, która radzi sobie z wyjątkami, których nie obsługuje kod aplikacji.

Gdy w aplikacji wystąpi nieobsługiwany błąd, Nest.js wyłapuje go i zwraca klientowi wewnętrzny błąd serwera 500. JSON zwracany w tym przypadku przez Nest.js wygląda następująco:

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

Jeśli obiekt błędu zgłaszany przez Twój kod zawiera plik Kod statusu i a wiadomość, Nest.js zwróci te wartości zamiast odpowiedzi domyślnej.

Aby uniknąć tego ogólnego zachowania i wysłać klientowi bardziej znaczącą odpowiedź na błąd, należy pilnie zająć się wszystkimi błędami, które mogą wystąpić w aplikacji. Można to osiągnąć, korzystając z wbudowanych lub niestandardowych filtrów wyjątków Nest.js.

instagram viewer

Tworzenie niestandardowego filtra wyjątków

Aby zademonstrować proces tworzenia niestandardowego filtra wyjątków, spróbuj utworzyć taki, który będzie obsługiwał wszystkie wyjątki HTTP.

Zacznij od pliku o nazwie http.wyjątek.ts i dodaj do niego następujący import:

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

import { Request, Response } from'express';

Przywóz ten służy następującym celom.

  • Filtr wyjątków: Jest to interfejs opisujący implementację filtra wyjątków.
  • Złapać: Jest to dekorator, który oznacza klasę jako filtr wyjątku Nest.
  • Host argumentów: Ten interfejs udostępnia metody pobierania argumentów przekazanych do procedury obsługi. Pozwala wybrać odpowiedni kontekst wykonania (np. HTTP, RPC lub WebSockets), z którego będą pobierane argumenty.
  • Wyjątek Http: Jest to klasa definiująca podstawowy wyjątek HTTP Nest.
  • Wniosek & Odpowiedź: Są to odpowiednio interfejsy obiektu żądania i odpowiedzi Express.js.

Następnie utwórz klasę, Filtr wyjątków Http, który realizuje Filtr wyjątków. Oznacz to za pomocą Złapać dekorator, aby wskazać, że obsługuje wyjątki HttpExceptions:

@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}

Następnie wypełnij klasę następującym kodem:

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

Ten blok kodu pobiera obiekty żądania i odpowiedzi z obiektu ArgumentsHost i wyodrębnia odpowiednie informacje z wyjątku. Zwraca do klienta ustrukturyzowaną odpowiedź obiektu JSON ze szczegółami dotyczącymi błędu.

Filtry wyjątków wiązania

Możesz powiązać filtr wyjątków z kontrolerem lub całą aplikacją, w zależności od potrzeb.

Aby globalnie powiązać filtr wyjątków, najpierw zaimportuj filtr wyjątków do pliku główne.ts plik. Następnie przekaż instancję filtra wyjątków 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();

Aby powiązać wyjątek z kontrolerem, zaimportuj plik Użyj filtrów dekorator i filtr wyjątków. Dodaj adnotację do swojej klasy kontrolera za pomocą @Użyj filtrów dekorator i przekaż instancję filtra wyjątków jako argument dekoratorowi:

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

Miejsce powiązania filtra określi zakres obsługi błędów. Filtry powiązane z kontrolerem będą obsługiwały tylko kontroler, z którym je powiązano, a filtry powiązane z aplikacją będą obsługiwały całą aplikację.

Używanie wbudowanych wyjątków do zgłaszania błędów

Nest.js udostępnia wbudowane klasy wyjątków, których można używać do zgłaszania błędów.

Na przykład możesz rzucić 404 błędy kodu stanu z Nie znaleziono wyjątku klasa:

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

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

Ten blok kodu używa oświadczenie warunkowe aby sprawdzić, czy dany użytkownik istnieje. Jeśli nie, zgłasza błąd 404 przy użyciu metody Nie znaleziono wyjątku, przekazując wiadomość jako argument.

Typowe wbudowane klasy wyjątków

Inne wbudowane klasy wyjątków obejmują między innymi następujące.

  • Wyjątek BadRequest: Zgłasza wyjątek wskazujący nieprawidłowe żądanie z kodem stanu 400. Możesz użyć tego wyjątku, gdy żądanie klienta jest nieprawidłowe lub źle sformułowane, a serwer nie może go przetworzyć z powodu błędu klienta. Zwykle oznacza to, że klient musi zmodyfikować żądanie, aby było ważne.
  • Nieautoryzowany wyjątek: Zgłasza wyjątek wskazujący nieautoryzowany dostęp z kodem stanu 401. Tego wyjątku można użyć, gdy użytkownik nie jest uwierzytelniony lub nie ma niezbędnych uprawnień dostępu do zasobu.
  • ZabronionyWyjątek: Zgłasza wyjątek wskazujący zabroniony dostęp z kodem stanu 403. Możesz użyć tego wyjątku, gdy użytkownik jest uwierzytelniony, ale nie autoryzowany aby wykonać konkretną czynność.
  • Wyjątek RequestTimeout: Zgłasza wyjątek wskazujący, że upłynął limit czasu żądania z kodem stanu 408. Możesz użyć tego wyjątku, gdy serwer kończy żądanie, ponieważ jego przetwarzanie trwało zbyt długo.
  • Wyjątek Konflikt: Zgłasza wyjątek wskazujący konflikt z kodem stanu 409. Tego wyjątku można użyć w przypadku konfliktu między żądaniem klienta a bieżącym stanem zasobu, na przykład podczas próby utworzenia zasobu, który już istnieje.
  • Wyjątek InternalServerError: Zgłasza wyjątek wskazujący wewnętrzny błąd serwera z kodem stanu 500. Możesz użyć tego wyjątku, gdy po stronie serwera wystąpi nieoczekiwany błąd, wskazujący, że serwer nie może spełnić żądania z powodu problemu wewnętrznego.

Najlepsze praktyki dotyczące obsługi błędów w Nest.js

Podczas obsługi błędów w Nest.js pamiętaj o użyciu filtrów wyjątków, aby wychwytywać i obsługiwać wyjątki globalnie lub dla poszczególnych kontrolerów. Można także tworzyć niestandardowe filtry dla określonych typów wyjątków.

Ponadto upewnij się, że używasz odpowiednich wbudowanych klas wyjątków, aby zgłaszać właściwe i znaczące błędy. Te praktyki mogą znacząco poprawić niezawodność Twoich aplikacji Nest.js.