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

أحداث الخادم SSE وبث الملفات

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

أحداث الخادم SSE وبث الملفات

ليست WebSockets الخيار الوحيد للتحديثات الفورية. تبث Server-Sent Events تحديثات باتجاه واحد عبر HTTP عادي، وتسمح StreamableFile للمتحكم بإرجاع ملفات كبيرة دون تحميل كامل الحمولة في الذاكرة.

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

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

  • تصلح SSE لتحديثات التقدم والتنبيهات ولوحات المتابعة والسجلات حيث يدفع الخادم ويستمع المتصفح.
  • تعيد معالجات @Sse() كائناً Observable من MessageEvent.
  • تغلف StreamableFile تيار قراءة وتتكامل مع معالجة استجابة Nest.
  • اضبط Content-Type و Content-Disposition ورؤوس التخزين المؤقت الصحيحة للتنزيلات.
  • للملفات الكبيرة جداً أو الخاصة، فكر في روابط تخزين كائنات موقعة بدلاً من تمرير كل بايت عبر خادم التطبيق.

مثال عملي

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

@Controller('jobs') export class JobsController { @Sse(':id/events') events(@Param('id') id: string): Observable<MessageEvent> { return this.jobsService.progress$(id).pipe( map((progress) => ({ data: progress })), ); } @Get(':id/export') download(@Param('id') id: string): StreamableFile { const stream = this.exportsService.openReadStream(id); return new StreamableFile(stream, { type: 'text/csv' }); } }
ملاحظة تصميمية: SSE أبسط من WebSockets عندما يكون الاتصال باتجاه واحد. وبث الملفات أكثر أماناً من قراءتها في buffers لأن استخدام الذاكرة يبقى محدوداً.

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

  • استخدم SSE للتحديثات الحية باتجاه واحد وWebSockets للتعاون ثنائي الاتجاه.
  • أغلق الـ observables عند قطع اتصال العملاء.
  • اضبط رؤوس التنزيل صراحة.
  • تجنب تخزين الصادرات الكبيرة في الذاكرة.
قاعدة عملية: إذا جعلت الميزة الحدود أوضح والاختبارات أسهل فهي اختيار جيد. إذا أخفت التبعيات أو صعّبت التتبع، فأعد التصميم.

الخلاصة

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