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

خط WebSocket المتقدم والمحوّلات

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

خط WebSocket المتقدم والمحوّلات

تدعم بوابات NestJS الأفكار المعمارية نفسها الموجودة في HTTP: الحراس والأنابيب والمعترضات والمرشحات والمحوّلات. الاختلاف أن السياق اتصال socket وحمولة رسالة بدلاً من زوج طلب واستجابة.

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

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

  • تتعامل خطافات دورة حياة البوابة مع التهيئة والاتصال وقطع الاتصال.
  • يمكن للحراس مصادقة المصافحة أو كل رسالة حسب مكان تطبيقهم.
  • تتحقق الأنابيب من حمولة الرسالة الواردة قبل تشغيل المعالج.
  • تعيّن مرشحات الاستثناءات الأخطاء إلى أحداث خطأ socket بدلاً من رموز حالة HTTP.
  • تسمح المحوّلات المخصصة بتكامل توسع مدعوم بـ Redis أو خوادم Socket.IO مخصصة أو مكتبة WebSocket مختلفة.

مثال عملي

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

@WebSocketGateway({ namespace: 'chat' }) @UseGuards(WsJwtGuard) export class ChatGateway implements OnGatewayConnection { handleConnection(client: Socket) { this.presenceService.join(client.user.id, client.id); } @SubscribeMessage('message.create') @UsePipes(new ValidationPipe({ transform: true })) async createMessage(@MessageBody() dto: CreateMessageDto) { return this.chatService.create(dto); } }
ملاحظة تصميمية: البوابة لا تزال حدّاً للتطبيق. تحقق من الحمولات، وفوض الأفعال، وعيّن الأخطاء بوضوح؛ لا تعامل رسائل socket كاستدعاءات داخلية موثوقة.

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

  • صادق الاتصالات وأعد فحص التفويض للرسائل الحساسة.
  • استخدم تحقق DTO لأجسام الرسائل.
  • خطط للتوسع الأفقي بمحول مشترك قبل ميزات المحادثة أو الحضور الإنتاجية.
  • عالج تنظيف قطع الاتصال لتجنب حضور أو أقفال قديمة.
قاعدة عملية: إذا جعلت الميزة الحدود أوضح والاختبارات أسهل فهي اختيار جيد. إذا أخفت التبعيات أو صعّبت التتبع، فأعد التصميم.

الخلاصة

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