NestJS — Node.js للمؤسسات

الأحداث ووحدة HTTP والمرونة في الاتصالات الخارجية

18 دقيقة الدرس 60 من 80

الأحداث ووحدة HTTP والمرونة في الاتصالات الخارجية

ليس كل فعل يجب أن يرتبط مباشرة بمعالج الطلب. تفصل أحداث المجال التفاعلات الداخلية، بينما توفر HttpModule عميل Axios قابلاً للحقن للاتصالات الخارجية. معاً يدعمان تكاملات نظيفة عند اقترانهما بالمهلات وإعادة المحاولة والتكرارية الآمنة.

الفكرة الأساسية

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

  • تسمح EventEmitterModule لحدث واحد بتشغيل عدة مستمعين دون أن يعرفهم الناشر.
  • تفيد الأحداث للآثار الجانبية المحلية مثل سجلات التدقيق وطلبات البريد وإبطال التخزين المؤقت.
  • تضبط HttpModule.registerAsync() عملاء Axios من ConfigService أو إعدادات مدعومة بالأسرار.
  • تحتاج الاتصالات الخارجية إلى مهلات وإعادة محاولة مضبوطة؛ لا تسمح لخدمة خارجية بتعليق الطلب بلا حد.
  • استخدم مفاتيح idempotency عند إعادة محاولة عمليات الكتابة ضد خدمات خارجية.

مثال عملي

يوضح المثال التالي الشكل العملي للفكرة داخل مشروع NestJS. ليست الغاية حفظ الكود، بل فهم مكانه في المعمارية:

@Injectable() export class OrdersService { constructor(private readonly events: EventEmitter2) {} async create(dto: CreateOrderDto) { const order = await this.repo.save(dto); this.events.emit('order.created', new OrderCreatedEvent(order.id)); return order; } } HttpModule.registerAsync({ inject: [ConfigService], useFactory: (config: ConfigService) => ({ baseURL: config.getOrThrow('PAYMENTS_URL'), timeout: 3000, }), });
ملاحظة تصميمية: الأحداث ليست وسيط رسائل موزعاً. هي ممتازة داخل عملية واحدة؛ استخدم الطوابير أو خدمات مصغرة مدعومة بوسيط عندما يجب أن ينجو التسليم من تعطل العملية.

قائمة تطبيق إنتاجية

  • سمّ الأحداث بلغة المجال لا بتفاصيل التنفيذ.
  • اجعل المستمعين قابلين للتكرار الآمن عند احتمال إعادة المحاولة يدوياً.
  • اضبط مهلات HTTP الخارجية بشكل عام.
  • غلف الكتابات الخارجية بمفاتيح idempotency وتعيين أخطاء واضح.
قاعدة عملية: إذا جعلت الميزة الحدود أوضح والاختبارات أسهل فهي اختيار جيد. إذا أخفت التبعيات أو صعّبت التتبع، فأعد التصميم.

الخلاصة

يغطي هذا الدرس جزءاً متقدماً من NestJS يجب فهمه عند بناء تطبيقات مؤسسية. ركّز على الحدود الواضحة، والسلوك القابل للاختبار، واختيار الأداة المناسبة للسياق بدلاً من استخدام كل ميزة في كل مكان.