NestJS - نفس الخلفية الحقيقية على nodejs

الصورة

NestJS هو ذلك الإطار الذي تم إنشاؤه لجعل الحياة أسهل للمطور ، باستخدام الأساليب المعمارية الصحيحة وإملاء قواعده الخاصة.

لذلك ، فإن NestJS ليس مجرد إطار خلفي ، بل هو أيضًا فرصة لدخول عالم المفاهيم المتقدمة ، مثل DDD و Event sourcing و microservice. يتم حزم كل شيء بطريقة بسيطة وسهلة ، وبالتالي فإن الخيار لك - سواء قررت استخدام النظام الأساسي بأكمله أو مجرد استخدام مكوناته.

أولاً ، سوف أخبرك عن تجربتي. لفترة طويلة كتبت على ASP.NET ، ثم كان هناك واجهة على AngularJS. في أكتوبر 2016 ، كان هناك تحول إلى Angular و Typescript. وهنا هو! الكتابة في الواجهة الأمامية ، يمكنك القيام بأشياء معقدة بسهولة تامة! قبل هذا (التطوير على nestjs) على العقدة ، قمت بتطويره فقط من أجل المتعة ، وبطريقة ما كانت هناك محاولة لإدخال الممارسات الجيدة والوصلة في Koa الشعبية . لكن NestJS لا يزال مختلفًا بعض الشيء.

NestJS ، إطار عمل مكتوب بالكامل في TypeScript (يدعم أيضًا JS ، لكن الأنواع جيدة جدًا) ، ومن السهل اختباره ويحتوي على كل ما تحتاجه.

كيفية إنشاء تطبيق بسيط على NestJS؟

وقد NestJS صريحة تحت غطاء محرك السيارة. أي امتدادات للتعبير عن سهل التنفيذ في Nest. ولكن ليست هذه هي النقطة هنا ، مع رغبة قوية يمكن التعبير عنها وتغييرها.

أولاً ، يمكنك نسخ مجموعة بداية صغيرة لنفسك:

git clone https://github.com/nestjs/typescript-starter.git project 

يتضمن Server.ts وظيفة غير متزامنة مسؤولة عن تحميل تطبيقنا:

 import { NestFactory } from '@nestjs/core'; import { ApplicationModule } from './modules/app.module'; async function bootstrap() { const app = await NestFactory.create(ApplicationModule); await app.listen(3000); } bootstrap(); 

حسنًا ، ثم ابدأ تشغيل npm start وانظر التطبيق على المنفذ 3000.

ما هو NestJS مصنوعة من؟

استلهم مؤلف الإطار أفكار Angular ، واتضح أن NestJS يشبه إلى حد كبير Angular ، خاصة في الإصدارات السابقة.

تحكم

طبقة التحكم مسؤولة عن معالجة الطلبات الواردة وإرجاع استجابة إلى العميل. مثال تحكم بسيط:

 import { Controller, Get } from '@nestjs/common'; @Controller('cats') export class CatsController { @Get() findAll() { return []; } } 

مقدمي الخدمات

كل شيء تقريبًا هو المزوّدون - الخدمة ، المستودع ، المصنع ، المساعد ، إلخ. يمكن تنفيذها في وحدات التحكم ومقدمي الخدمات الآخرين. إذا قلت لغة Angular - كل شيءInjectables

على سبيل المثال ، خدمة منتظمة:
 import { Injectable } from '@nestjs/common'; import { Cat } from './interfaces/cat.interface'; @Injectable() export class CatsService { private readonly cats: Cat[] = []; create(cat: Cat) { this.cats.push(cat); } findAll(): Cat[] { return this.cats; } } 

وحدات

الوحدة النمطية هي فئة ذات ديكور الوحدة النمطية (). يوفر Decorator () الوحدة الوصفية التي يستخدمها Nest لتنظيم بنية التطبيق. يحتوي كل تطبيق Nest على وحدة نمطية واحدة على الأقل ، وهي وحدة الجذر. وحدة الجذر هي حيث يبدأ Nest في تنظيم شجرة التطبيق. في الواقع ، قد تكون الوحدة النمطية للجذر هي الوحدة الوحيدة في التطبيق الخاص بك ، خاصةً عندما يكون التطبيق صغيرًا ، ولكن هذا لا معنى له. في معظم الحالات ، سيكون لديك عدة وحدات ، كل منها يحتوي على مجموعة من الميزات وثيقة الصلة. في Nest ، تكون الوحدات مفردة افتراضيًا ، بحيث يمكنك مشاركة مثيل المكون نفسه بسهولة بين وحدتين أو أكثر.

 import { Module } from '@nestjs/common'; import { CatsController } from './cats.controller'; import { CatsService } from './cats.service'; @Module({ controllers: [CatsController], components: [CatsService], }) export class CatsModule {} 

قليلا عن وحدات ديناميكية

يأتي نظام وحدات Nest مع وظيفة وحدة ديناميكية. هذا يسمح لك بإنشاء وحدات مخصصة دون أي جهد. دعنا نلقي نظرة على DatabaseModule:

 import { Module, DynamicModule } from '@nestjs/common'; import { createDatabaseProviders } from './database.providers'; import { Connection } from './connection.component'; @Module({ components: [Connection], }) export class DatabaseModule { static forRoot(entities = [], options?): DynamicModule { const providers = createDatabaseProviders(options, entities); return { module: DatabaseModule, components: providers, exports: providers, }; } } 

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

 import { Module } from '@nestjs/common'; import { DatabaseModule } from './database/database.module'; import { User } from './users/entities/user.entity'; @Module({ imports: [ DatabaseModule.forRoot([User]), ], }) export class ApplicationModule {} 

بالمناسبة ، للعمل مع قاعدة البيانات هناك TypeORM بارد يمكن أن تعمل مع معظم قواعد البيانات.

Middlewares

Middlewares هي وظيفة تسمى قبل معالج التوجيه. لديهم حق الوصول إلى الطلب والاستجابة. في الواقع ، هي نفسها كما في التعبير .

 import { Injectable, NestMiddleware, MiddlewareFunction } from '@nestjs/common'; @Injectable() export class LoggerMiddleware implements NestMiddleware { resolve(...args: any[]): MiddlewareFunction { return (req, res, next) => { console.log('Request...'); next(); }; } } 

مرشحات استثناء

يحتوي Nest على طبقة استثناء ، تكون مسؤولة عن جذب الاستثناءات غير المعالجة وإعادة الاستجابة المناسبة إلى المستخدم النهائي.

تتم معالجة كل استثناء بواسطة عامل تصفية الاستثناء العام ، وعندما لا يتم التعرف عليه (وليس HttpException أو فئة ترث HttpException) ، يتلقى المستخدم استجابة JSON التالية:

 { "statusCode": 500, "message": "Internal server error" } 

أنابيب

يجب تنفيذ توجيه الإخراج واجهة PipeTransform.
 import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common'; @Injectable() export class ValidationPipe implements PipeTransform { transform(value: any, metadata: ArgumentMetadata) { return value; } } 

تحول الأنابيب المدخلات إلى النتيجة المرجوة.

بالإضافة إلى ذلك ، قد يمر هذا من أجل التحقق من الصحة ، حيث أنه من الممكن أيضًا لهم استثناءً إذا كانت البيانات غير صحيحة. على سبيل المثال:

 @Post() @UsePipes(new ValidationPipe(createCatSchema)) async create(@Body() createCatDto: CreateCatDto) { this.catsService.create(createCatDto); } 

أو يمكنك إعلان أنبوب عالمي:

 async function bootstrap() { const app = await NestFactory.create(ApplicationModule); app.useGlobalPipes(new ValidationPipe()); await app.listen(3000); } bootstrap(); 

حراس

يجب على الحراس تطبيق واجهة CanActivate. الحراس لديهم المسؤولية الوحيدة. يحددون ما إذا كان يجب معالجة الطلب بواسطة معالج التوجيه أم لا.

 @Injectable() export class RolesGuard implements CanActivate { canActivate( context: ExecutionContext, ): boolean | Promise<boolean> | Observable<boolean> { // const request = context.switchToHttp().getRequest(); // const data = context.switchToWs().getData(); return true; } } : <source lang="javascript"> @Controller('cats') @UseGuards(RolesGuard) export class CatsController {} 

اعتراضية

تحتوي أجهزة الاعتراض على عدد من الميزات المفيدة المستوحاة من تقنية البرمجة الموجهة نحو الجانب (AOP). إنها تسمح لك بـ:

  • ربط منطق إضافي قبل / بعد تنفيذ الطريقة ؛
  • تحويل النتيجة التي أرجعتها الوظيفة ؛
  • تحويل استثناء طرح من وظيفة
  • إعادة تعريف الوظيفة بالكامل وفقًا للشروط المحددة (على سبيل المثال ، للتخزين المؤقت).

خدمات Microservices

Nest Microservice هو مجرد تطبيق يستخدم طبقة نقل مختلفة (وليس HTTP).

يدعم Nest نوعين من الاتصالات - TCP و Redis pub / sub ، لكن استراتيجية النقل الجديدة سهلة التنفيذ من خلال تطبيق واجهة CustomTransportStrategy.

يمكنك بسهولة إنشاء خدمة microservice من تطبيقك:

 import { NestFactory } from '@nestjs/core'; import { ApplicationModule } from './modules/app.module'; import { Transport } from '@nestjs/microservices'; async function bootstrap() { const app = await NestFactory.createMicroservice(ApplicationModule, { transport: Transport.TCP, }); app.listen(() => console.log('Microservice is listening')); } bootstrap(); 

يتعرف Nest Microservice على الرسائل حسب الأنماط. النموذج عبارة عن قيمة بسيطة أو كائن أو سلسلة أو حتى رقم.

 import { Controller } from '@nestjs/common'; import { MessagePattern } from '@nestjs/microservices'; @Controller() export class MathController { @MessagePattern({ cmd: 'sum' }) sum(data: number[]): number { return (data || []).reduce((a, b) => a + b); } } 

وللتواصل بين خدمات microservices ، يجب عليك استخدام العميل:

 @Client({ transport: Transport.TCP, port: 5667 }) client: ClientProxy; 

وهنا سيتم إرسال الرسالة:

 @Get() call(): Observable<number> { const pattern = { cmd: 'sum' }; const data = [1, 2, 3, 4, 5]; return this.client.send<number>(pattern, data); } 

ترتبط كل من NestJS و Angular ارتباطًا وثيقًا بحيث يمكن رؤية مؤلف الإطار بسهولة في مؤتمرات واجتماعات ng. على سبيل المثال ، قام فريق nrwl مؤخرًا بتضمين قالب nestjs في nx الخاص به.

 ng g node-app nestjs-app -framework nestjs 

NestJS ناضجة بالفعل بما فيه الكفاية ، والعديد من الشركات تستخدم بالفعل.
من يستخدم NestJS في الإنتاج الآن؟

الإطار نفسه: https://github.com/nestjs/nest

العديد من الروابط الرائعة ذات الصلة هنا: Awest-nestjs
المجتمع الناطق باللغة الروسية من NestJS في برقية https://t.me/nest_ru
تقرير باللغة الروسية حول NestJS.

وبالطبع ، اشترك في القناة في برقية ngFanatic حيث توجد أخبار حول NestJS و Angular.

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

Source: https://habr.com/ru/post/ar439434/


All Articles