Необработените изключения могат да причинят объркване и разочарование. Почистете ги с филтри за изключения.
Филтрите за изключения Nest.js предоставят начин за прихващане и обработка на изключения глобално или на базата на контролер.
Те ви позволяват да централизирате логиката за обработка на грешки, да форматирате отговорите за грешки и да осигурите последователно обработване на грешки във вашето приложение. Научете за филтрите за изключения и как да ги използвате за подходящо обработване на грешки в приложението.
Обработка на грешки по подразбиране в Nest.js
По подразбиране Nest.js има слой за изключения, който се занимава с всички изключения, които кодът на вашето приложение не обработва.
Когато във вашето приложение възникне необработена грешка, Nest.js я хваща и връща 500 вътрешна сървърна грешка на клиента. JSON, който Nest.js връща в този случай, изглежда така:
{
"statusCode": 500,
"message": "Internal server error"
}
Ако обектът за грешка, който вашият код хвърля, съдържа a statusCode и а съобщение, Nest.js ще върне тези стойности вместо отговора по подразбиране.
За да избегнете това общо поведение и да изпратите по-смислен отговор за грешка на клиента, трябва старателно да се справите с всички грешки, които могат да възникнат във вашето приложение. Можете да постигнете това с помощта на вградени или персонализирани филтри за изключения на Nest.js.
Създаване на персонализиран филтър за изключения
За да демонстрирате процеса на създаване на персонализиран филтър за изключения, опитайте да създадете такъв, който ще обработва всички HTTP изключения.
Започнете с файл, наречен http.exception.ts и добавете следните импортирания към него:
import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';
import { Request, Response } from'express';
Този импорт служи за следните цели.
- Филтър за изключения: Това е интерфейс, описващ прилагането на филтър за изключения.
- Улов: Това е декоратор, който маркира клас като филтър за изключения на Nest.
- АргументиХост: Този интерфейс предоставя методи за извличане на аргументите, предадени на манипулатор. Тя ви позволява да изберете подходящия контекст на изпълнение (напр. HTTP, RPC или WebSockets), от който да извличате аргументи.
- HttpException: Това е клас, който дефинира основното HTTP изключение на Nest.
- Заявка & Отговор: Това са интерфейсите съответно за обект на заявка и отговор на Express.js.
След това създайте клас, HttpExceptionFilter, който прилага Филтър за изключения. Анотирайте го с Улов декоратор, за да посочи, че обработва HttpExceptions:
@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}
След това попълнете класа с този код:
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',
});
}
Този кодов блок извлича обектите за заявка и отговор от обекта ArgumentsHost и извлича подходяща информация от изключението. Той връща на клиента структуриран JSON обектен отговор с подробности за грешката.
Филтри за обвързващи изключения
Можете да свържете филтър за изключения към контролер или цялото ви приложение, в зависимост от вашите нужди.
За да свържете филтър за изключения глобално, първо импортирайте филтъра за изключения във вашия main.ts файл. След това предайте екземпляр на вашия филтър за изключения към app.useGlobalFilters метод:
// 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();
За да свържете изключение към контролер, импортирайте Използвайте филтри декоратор и вашия филтър за изключения. Анотирайте вашия клас контролер с @UseFilters декоратор и предайте екземпляр на вашия филтър за изключения като аргумент на декоратора:
@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}
Където обвързвате вашия филтър ще определи обхвата на обработката на вашите грешки. Филтрите, свързани с контролера, ще се погрижат само за контролера, към който сте го свързали, а филтрите, свързани с приложението, ще се погрижат за цялото приложение.
Използване на вградени изключения за генериране на грешки
Nest.js предоставя вградени класове за изключения, които можете да използвате за генериране на грешки.
Например, можете да хвърлите 404 грешки в кода на състоянието с NotFoundException клас:
getUserById(id: number) {
const user = users.find((user) => user.id id);
if (!user) {
thrownew NotFoundException({
message: `User with id ${id} not found`,
});
}
}
Този кодов блок използва условно изявление за да проверите дали дадения потребител съществува. Ако не, той извежда грешка 404, използвайки NotFoundException, предавайки съобщение като аргумент.
Често срещани вградени класове за изключения
Други вградени класове изключения включват, но не се ограничават до следното.
- BadRequestException: Извежда изключение, показващо лоша заявка с код на състоянието от 400. Можете да използвате това изключение, когато заявката на клиента е невалидна или неправилно формирана и сървърът не може да я обработи поради грешка на клиента. Това обикновено означава, че клиентът трябва да промени заявката, за да я направи валидна.
- UnauthorizedException: Извежда изключение, показващо неоторизиран достъп с код на състояние от 401. Можете да използвате това изключение, когато даден потребител не е удостоверен или му липсват необходимите разрешения за достъп до ресурс.
- ForbiddenException: Извежда изключение, показващо забранен достъп с код за състояние от 403. Можете да използвате това изключение, когато потребител е удостоверени, но неупълномощени за извършване на конкретно действие.
- RequestTimeoutException: Извежда изключение, което показва, че времето за изчакване на заявката е изтекло с код на състоянието от 408. Можете да използвате това изключение, когато сървър прекрати заявка, тъй като обработката й отне твърде много време.
- ConflictException: Извежда изключение, показващо конфликт с код на състояние на 409. Можете да използвате това изключение, когато има конфликт между заявката на клиента и текущото състояние на ресурса, като например когато се опитвате да създадете ресурс, който вече съществува.
- InternalServerErrorException: Извежда изключение, показващо вътрешна грешка на сървъра с код на състоянието на 500. Можете да използвате това изключение, когато възникне неочаквана грешка от страна на сървъра, което показва, че сървърът не може да изпълни заявката поради вътрешен проблем.
Най-добри практики за обработка на грешки в Nest.js
Когато обработвате грешки в Nest.js, не забравяйте да използвате филтри за изключения, за да улавяте и обработвате изключения глобално или за всеки контролер. Можете също да създадете персонализирани филтри за конкретни типове изключения.
Освен това се уверете, че използвате подходящите вградени класове за изключения, за да хвърляте правилни и смислени грешки. Тези практики могат значително да подобрят надеждността на вашите Nest.js приложения.