الاستثناءات غير المعالجة يمكن أن تسبب الارتباك والإحباط. قم بتنظيفها باستخدام مرشحات الاستثناء.

توفر عوامل تصفية الاستثناءات Nest.js طريقة لاعتراض الاستثناءات ومعالجتها عالميًا أو على أساس كل وحدة تحكم.

فهي تتيح لك مركزية منطق معالجة الأخطاء، وتنسيق استجابات الأخطاء، وتوفير معالجة متسقة للأخطاء عبر التطبيق الخاص بك. تعرف على عوامل تصفية الاستثناءات وكيفية استخدامها للتعامل مع أخطاء التطبيق بشكل مناسب.

معالجة الأخطاء الافتراضية في Nest.js

افتراضيًا، يحتوي Nest.js على طبقة استثناء تتعامل مع أي استثناءات لا يتعامل معها كود التطبيق الخاص بك.

عند حدوث خطأ لم تتم معالجته في تطبيقك، يلتقط Nest.js الخطأ ويعيد خطأ خادم داخلي 500 إلى العميل. يبدو JSON الذي يُرجعه Nest.js في هذه الحالة كما يلي:

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

إذا كان كائن الخطأ الذي يرميه الكود الخاص بك يحتوي على ملف كود الحالة و أ رسالةسوف يقوم Nest.js بإرجاع هذه القيم بدلاً من الاستجابة الافتراضية.

لتجنب هذا السلوك العام، وإرسال استجابة أكثر وضوحًا للخطأ إلى العميل، تحتاج إلى التعامل بعناية مع جميع الأخطاء التي قد تحدث في تطبيقك. يمكنك تحقيق ذلك باستخدام مرشحات الاستثناءات المضمنة أو المخصصة في Nest.js.

instagram viewer

إنشاء عامل تصفية استثناء مخصص

لتوضيح عملية إنشاء عامل تصفية استثناءات مخصص، حاول إنشاء مرشح يمكنه التعامل مع كافة استثناءات HTTP.

ابدأ بملف يسمى http.exception.ts وأضف إليها الواردات التالية:

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

import { Request, Response } from'express';

تخدم هذه الواردات الأغراض التالية.

  • ExceptionFilter: هذه واجهة تصف تنفيذ مرشح الاستثناء.
  • يمسك: هذا مصمم يصنف الفصل على أنه مرشح استثناء Nest.
  • وسيطاتHost: توفر هذه الواجهة طرقًا لاسترداد الوسائط التي تم تمريرها إلى المعالج. يسمح لك باختيار سياق التنفيذ المناسب (على سبيل المثال، HTTP أو RPC أو WebSockets) لاسترداد الوسائط منه.
  • httpException: هذه فئة تحدد استثناء Nest HTTP الأساسي.
  • طلب & إجابة: هذه هي الواجهات الخاصة بطلب Express.js وكائن الاستجابة، على التوالي.

بعد ذلك، قم بإنشاء فصل دراسي، HttpExceptionFilter، الذي ينفذ ExceptionFilter. قم بتعليقه مع يمسك الديكور للإشارة إلى أنه يتعامل مع 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 Decorator وقم بتمرير مثيل لمرشح الاستثناء الخاص بك كوسيطة إلى الديكور:

@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. يمكنك استخدام هذا الاستثناء عندما يكون طلب العميل غير صالح أو مشوه، ولا يمكن للخادم معالجته بسبب خطأ العميل. وهذا يعني عادةً أن العميل يحتاج إلى تعديل الطلب لجعله صالحًا.
  • استثناء غير مصرح به: يطرح استثناءً يشير إلى الوصول غير المصرح به برمز الحالة 401. يمكنك استخدام هذا الاستثناء عندما لا تتم مصادقة المستخدم أو عندما يفتقر إلى الأذونات اللازمة للوصول إلى أحد الموارد.
  • ForbiddenException: يطرح استثناءً يشير إلى الوصول المحظور برمز الحالة 403. يمكنك استخدام هذا الاستثناء عندما يكون المستخدم مصادق عليه ولكن غير مصرح به لتنفيذ إجراء معين.
  • RequestTimeoutException: يطرح استثناءً يشير إلى انتهاء مهلة الطلب برمز الحالة 408. يمكنك استخدام هذا الاستثناء عندما ينهي الخادم طلبًا لأن معالجته استغرقت وقتًا طويلاً.
  • ConflictException: يطرح استثناءً يشير إلى وجود تعارض مع رمز الحالة الخاص بـ 409. يمكنك استخدام هذا الاستثناء عندما يكون هناك تعارض بين طلب العميل والحالة الحالية للمورد، كما هو الحال عند محاولة إنشاء مورد موجود بالفعل.
  • InternalServerErrorException: يطرح استثناءً يشير إلى وجود خطأ داخلي في الخادم مع رمز الحالة 500. يمكنك استخدام هذا الاستثناء عند حدوث خطأ غير متوقع من جانب الخادم، مما يشير إلى أن الخادم لا يمكنه تلبية الطلب بسبب مشكلة داخلية.

أفضل الممارسات لمعالجة الأخطاء في Nest.js

عند معالجة الأخطاء في Nest.js، تأكد من استخدام مرشحات الاستثناءات لالتقاط الاستثناءات ومعالجتها عالميًا أو لكل وحدة تحكم. يمكنك أيضًا إنشاء عوامل تصفية مخصصة لأنواع استثناءات محددة.

بالإضافة إلى ذلك، تأكد من استخدام فئات الاستثناءات المضمنة المناسبة لإلقاء أخطاء مناسبة وذات معنى. يمكن لهذه الممارسات تحسين موثوقية تطبيقات Nest.js بشكل كبير.