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

DiscoveryService والاستقلال عن المنصة والإضافات

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

DiscoveryService والاستقلال عن المنصة والإضافات

تحتاج مشاريع NestJS المتقدمة أحياناً إلى سلوك شبيه بالإطار داخل التطبيق: العثور على كل معالج يحمل مزخرفاً، أو تسجيل مشتركي الأحداث تلقائياً، أو بناء نظام إضافات. تسمح DiscoveryService وفحص البيانات الوصفية بتفقد رسم التطبيق بأمان.

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

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

  • تعرض DiscoveryService أغلفة المزوّدات والمتحكمات لتفقد بياناتها بعد أن يبني Nest الحاوية.
  • يمر MetadataScanner على دوال النموذج الأولي ويفيد عندما يطبق المزخرف على دوال محددة.
  • الاستقلال عن المنصة يعني أن المكونات القابلة لإعادة الاستخدام يجب ألا تستورد أنواع Express أو Fastify إلا عند اعتماد الميزة فعلاً على منصة معينة.
  • ينبغي للإضافات تسجيل مزوداتها عبر الوحدات والبيانات الوصفية لا عبر استيراد داخليات التطبيق يدوياً.
  • الاكتشاف شأن وقت الإقلاع؛ خزّن السجل المكتشف بدلاً من الفحص في كل طلب.

مثال عملي

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

export const CronJob = Reflector.createDecorator<string>(); @Injectable() export class CronExplorer implements OnModuleInit { constructor(private readonly discovery: DiscoveryService) {} onModuleInit() { for (const wrapper of this.discovery.getProviders()) { const instance = wrapper.instance; if (!instance) continue; for (const methodName of Object.getOwnPropertyNames(Object.getPrototypeOf(instance))) { const cron = Reflect.getMetadata(CronJob.KEY, instance[methodName]); if (cron) this.register(cron, instance[methodName].bind(instance)); } } } }
ملاحظة تصميمية: لا تحتاج DiscoveryService في CRUD اليومي. تصبح مفيدة عندما يقدم تطبيقك إطاراً صغيراً للمهام أو السياسات أو المشتركين أو وحدات الميزات.

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

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

الخلاصة

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