تايب سكريبت - التعامل مع التبعيات الخارجية في نِست.جي إس
ما هي أفضل ممارسة حول كيفية التعامل مع التبعيات من الطرف الثالث (أي التبعيات التي لا تأتي في شكل وحدة Nest) في Nest؟
على سبيل المثال، أنا أستخدم morgan في وحدة التسجيل الخاصة بي مباشرة عن طريق استيراده في الملف المعني:
import { Injectable, MiddlewareFunction, NestMiddleware } from '@nestjs/common';
import * as morgan from 'morgan';
@Injectable()
export class NestLoggingMiddleware implements NestMiddleware {
resolve(...args: any[]): MiddlewareFunction {
/** use morgan here, e.g. wrap it in a custom middleware ... */
}
}
الآن أعلم أن بنية Nest تتأثر بشكل كبير بـ Angular، ووجدت هذه المقالة التي تشرح كيفية التعامل مع التبعيات الخارجية في Angular. هل تنطبق الفكرة نفسها على Nest؟ هل يجب أن أنشئ مزودًا مخصصًا لـ morgan وأحقنه؟ وهل يجب أن أحقن مجرد استيراد morgan، أم نسخة morgan تم تكوينها بالفعل؟
الإجابة رقم 1
نعم، حقن التبعيات من أطراف ثالثة كمقدمي خدمات مخصصين هو الطريق الأمثل. يمكنك استخدام دالة مصنع غير متزامنة لحقن التبعيات اللازمة لإعداد التكوين. بهذه الطريقة، ستحصل على نسخة معدة مسبقًا.
هذا مثال على ما فعلته مؤخرًا:
import { Telegraf } from 'telegraf';
// ...
providers: [
{
provide: Telegraf,
useFactory: async (configService: ConfigService) => {
return new Telegraf(configService.telegramToken);
},
inject: [ConfigService],
},
]
اعتمادًا على متطلباتك، قد يكون من المنطقي إنشاء وحدة جديدة لاعتمادك تعيد تصدير مزودك. بدلاً من تصدير مثيل الطرف الثالث الخاص بك مباشرة، يمكنك أيضًا إنشاء خدمة واجهة، تُغلف الاعتماد. بهذه الطريقة، يصبح من الأسهل استبدال المكتبة في وقت لاحق.
