مقدمة إلى NestJS
\n\nNestJS (Nest) هو إطار عمل تقدمي لبناء تطبيقات خادم فعالة وقابلة للتوسع وموثوقة على Node.js. يستخدم TypeScript كلغة أساسية ومستوحى من بنية Angular. يوفر NestJS بنية تطبيق جاهزة تساعد المطورين على إنشاء كود منظم جيدًا وقابل للاختبار والصيانة.
\n\nالهدف الرئيسي لـ NestJS هو حل مشكلة عدم وجود بنية واضحة في نظام Node.js البيئي. على عكس Express أو Fastify، اللذين يعتبران بسيطين ولا يفرضان هيكلًا، يقدم NestJS تجريدات جاهزة: الوحدات، وحدات التحكم، الخدمات، المزودون، والبرمجيات الوسيطة. هذا مفيد بشكل خاص للمشاريع المؤسسية الكبيرة حيث تكون قابلية التنبؤ والتوحيد القياسي للكود مهمة.
\n\nNestJS مبني فوق أطر HTTP (بشكل افتراضي Express، ولكن يمكن استخدام Fastify) ويضيف إليها نظامًا قويًا لحقن التبعيات (Dependency Injection)، والمزينات، والحراس (Guards)، والمعترضات (Interceptors)، والأنابيب (Pipes)، والمرشحات (Filters). يستخدم الإطار بشكل نشط مزينات TypeScript، مما يجعل الكود تصريحيًا وقابلاً للقراءة.
\n\nتثبيت NestJS
\n\nلتثبيت NestJS، ستحتاج إلى Node.js (الإصدار 16 أو أعلى) ومدير حزم npm (أو yarn، pnpm).
\n\nأسهل طريقة للبدء هي استخدام Nest CLI:
\n\nnpm install -g @nestjs/cli\nnest new my-nest-project\ncd my-nest-project\nnpm run start:dev\n\nإذا كنت تفضل تثبيت NestJS في مشروع موجود بالفعل:
\n\nnpm install @nestjs/core @nestjs/common @nestjs/platform-express reflect-metadata rxjs typescript @types/node\n\nستحتاج أيضًا إلى تثبيت TypeScript و ts-node للتطوير:
\n\nnpm install -D typescript @types/node ts-node\n\nهام: يستخدم NestJS مكتبة reflect-metadata للعمل مع المزينات. تأكد من استيرادها في الملف الرئيسي main.ts:
import "reflect-metadata";\n\nبداية سريعة مع مثال كود
\n\nلنقم بإنشاء تطبيق REST API بسيط بنقطة نهاية واحدة ترجع تحية.
\n\nهيكل المشروع:
\nsrc/\n├── app.controller.ts\n├── app.module.ts\n├── app.service.ts\n└── main.ts\n\nmain.ts — نقطة الدخول:
\nimport { NestFactory } from '@nestjs/core';\nimport { AppModule } from './app.module';\n\nasync function bootstrap() {\n const app = await NestFactory.create(AppModule);\n await app.listen(3000);\n console.log('Server is running on http://localhost:3000');\n}\nbootstrap();\n\napp.module.ts — الوحدة الجذرية:
\nimport { Module } from '@nestjs/common';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\n\n@Module({\n imports: [],\n controllers: [AppController],\n providers: [AppService],\n})\nexport class AppModule {}\n\napp.controller.ts — وحدة التحكم:
\nimport { Controller, Get } from '@nestjs/common';\nimport { AppService } from './app.service';\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @Get()\n getHello(): string {\n return this.appService.getHello();\n }\n}\n\napp.service.ts — الخدمة (منطق الأعمال):
\nimport { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n getHello(): string {\n return 'Hello World!';\n }\n}\n\nقم بتشغيل التطبيق باستخدام الأمر npm run start:dev وافتح http://localhost:3000. سترى "Hello World!".
الأساليب والوظائف الأساسية في NestJS
\n\nدعنا نستعرض 10 عناصر رئيسية في NestJS تُستخدم في كل مشروع.
\n\n1. @Module() — مزين الوحدة
\nما يفعله: يحدد كل