NestJS - das gleiche echte Backend für NodeJS

Bild

NestJS ist ein Framework, das das Leben eines Entwicklers erleichtert, die richtigen Architekturansätze verwendet und seine eigenen Regeln diktiert.

Daher ist NestJS nicht nur ein Backend-Framework, sondern auch die Möglichkeit, in die Welt fortschrittlicher Konzepte wie DDD , Event Sourcing und Microservice-Architektur einzusteigen. Alles ist auf einfache und unkomplizierte Weise verpackt, sodass Sie die Wahl haben - ob Sie die gesamte Plattform oder nur deren Komponenten verwenden möchten.

Zunächst erzähle ich Ihnen von meinen Erfahrungen. Lange habe ich auf ASP.NET geschrieben, dann gab es ein Frontend auf AngularJS. Im Oktober 2016 wurde auf Angular und Typescript umgestellt. Und hier ist es! Wenn Sie im Frontend tippen, können Sie ganz einfach komplexe Dinge erledigen! Zuvor (Entwicklung auf nestjs) auf Node habe ich es nur zum Spaß entwickelt, und irgendwie gab es sogar den Versuch, bewährte Praktiken und Typoskripte in das beliebte Koa einzuführen . Aber NestJS ist immer noch ein bisschen anders.

NestJS, ein Framework, das vollständig in TypeScript geschrieben ist (es unterstützt auch JS, aber die Typen sind sehr gut), ist einfach zu testen und enthält alles, was Sie benötigen.

Wie erstelle ich eine einfache Anwendung auf NestJS?

NestJS hat Express unter der Haube. Alle Erweiterungen für Express sind einfach in Nest zu implementieren. Aber das ist hier nicht der Punkt, mit einem starken Wunsch kann Ausdruck genommen und geändert werden.

Zunächst können Sie sich ein kleines Starter-Kit kopieren:

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

Server.ts enthält eine asynchrone Funktion, die für das Laden unserer Anwendung verantwortlich ist:

 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(); 

Nun, dann starten Sie npm run start und sehen Sie die Anwendung auf Port 3000.

Woraus besteht NestJS?

Der Autor des Frameworks ließ sich von den Ideen von Angular inspirieren, und NestJS war Angular sehr ähnlich, insbesondere in früheren Versionen.

Controller

Die Controller-Schicht ist für die Verarbeitung eingehender Anforderungen und die Rückgabe einer Antwort an den Client verantwortlich. Ein einfaches Controller-Beispiel:

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

Anbieter

Fast alles ist Anbieter - Service, Repository, Fabrik, Helfer usw. Sie können in Controllern und anderen Anbietern implementiert werden. Wenn Sie die Sprache von Angular sagen, ist alles `@Injectables

Zum Beispiel ein regulärer Dienst:
 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; } } 

Module

Ein Modul ist eine Klasse mit dem Modul () -Dekorator. Der Module () -Dekorator stellt Metadaten bereit, mit denen Nest die Struktur der Anwendung organisiert. Jede Nest-Anwendung verfügt über mindestens ein Modul, das Root-Modul. Im Root-Modul beginnt Nest mit der Organisation des Anwendungsbaums. Tatsächlich ist das Root-Modul möglicherweise das einzige Modul in Ihrer Anwendung, insbesondere wenn die Anwendung klein ist, aber das macht keinen Sinn. In den meisten Fällen verfügen Sie über mehrere Module, von denen jedes über eng verwandte Funktionen verfügt. In Nest sind Module standardmäßig Singleton, sodass Sie dieselbe Komponenteninstanz problemlos für zwei oder mehr Module freigeben können.

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

Ein bisschen über dynamische Module

Das modulare System von Nest verfügt über eine dynamische Modulfunktion. Auf diese Weise können Sie ohne Aufwand benutzerdefinierte Module erstellen. Werfen wir einen Blick auf das 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, }; } } 

Es definiert standardmäßig die Verbindungskomponente, erstellt jedoch zusätzlich - abhängig von den übertragenen Optionen und Entitäten - eine Sammlung von Anbietern, z. B. Repository-Komponenten. Tatsächlich erweitert das dynamische Modul die Metadaten des Moduls. Diese wichtige Funktion ist nützlich, wenn Sie Komponenten dynamisch registrieren müssen. Anschließend können Sie das DatabaseModule wie folgt importieren:

 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 {} 

Für die Arbeit mit der Datenbank gibt es übrigens ein cooles TypeORM , das mit den meisten Datenbanken funktioniert.

Middlewares

Middlewares ist eine Funktion, die vor dem Routenhandler aufgerufen wird. Sie haben Zugriff auf Anfrage und Antwort. In der Tat sind sie die gleichen wie in Express .

 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(); }; } } 

Ausnahmefilter

Nest verfügt über eine Ausnahmeschicht, die dafür verantwortlich ist, nicht behandelte Ausnahmen abzufangen und die entsprechende Antwort an den Endbenutzer zurückzugeben.

Jede Ausnahme wird vom globalen Ausnahmefilter behandelt. Wenn sie nicht erkannt wird (keine HttpException oder eine Klasse, die eine HttpException erbt), erhält der Benutzer die folgende JSON-Antwort:

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

Rohre

Pipe muss die PipeTransform-Schnittstelle implementieren.
 import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common'; @Injectable() export class ValidationPipe implements PipeTransform { transform(value: any, metadata: ArgumentMetadata) { return value; } } 

Pipe konvertiert die Eingabe in das gewünschte Ergebnis.

Darüber hinaus kann dies als Validierung gelten, da sie auch eine Ausnahme auslösen können, wenn die Daten falsch sind. Zum Beispiel:

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

Oder Sie können eine globale Pipe deklarieren:

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

Wachen

Wachen müssen die CanActivate-Schnittstelle implementieren. Wachen haben die alleinige Verantwortung. Sie bestimmen, ob die Anforderung vom Routenhandler verarbeitet werden soll oder nicht.

 @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 {} 

Abfangjäger

Interceptors verfügen über eine Reihe nützlicher Funktionen, die von der AOP-Technik (Aspect-Oriented Programming) inspiriert sind. Sie ermöglichen Ihnen:

  • Binden Sie zusätzliche Logik vor / nach der Ausführung der Methode.
  • Konvertieren Sie das von der Funktion zurückgegebene Ergebnis.
  • Konvertieren Sie eine von einer Funktion ausgelöste Ausnahme
  • Definieren Sie die Funktion abhängig von den ausgewählten Bedingungen vollständig neu (z. B. für das Caching).

Microservices

Nest Microservice ist nur eine Anwendung, die eine andere Transportschicht (nicht HTTP) verwendet.

Nest unterstützt zwei Arten der Kommunikation - TCP und Redis Pub / Sub. Die neue Transportstrategie lässt sich jedoch einfach implementieren, indem die CustomTransportStrategy-Schnittstelle implementiert wird.

Sie können ganz einfach einen Microservice aus Ihrer Anwendung erstellen:

 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 erkennt Nachrichten anhand von Mustern. Ein Muster ist ein einfacher Wert, ein Objekt, eine Zeichenfolge oder sogar eine Zahl.

 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); } } 

Und für die Kommunikation zwischen Microservices müssen Sie den Client verwenden:

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

Und hier wird die Nachricht gesendet:

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

NestJS und Angular sind so eng miteinander verbunden, dass der Autor des Frameworks auf ng Konferenzen und Tagungen leicht zu sehen ist. Zum Beispiel hat das nrwl-Team kürzlich die nestjs-Vorlage in seine nx aufgenommen.

 ng g node-app nestjs-app -framework nestjs 

NestJS ist bereits ausgereift genug und wird von vielen Unternehmen bereits verwendet.
Wer nutzt NestJS gerade in der Produktion?

Das Framework selbst: https://github.com/nestjs/nest

Viele coole verwandte Links hier: Awesome-nestjs
Russischsprachige Gemeinschaft von NestJS in einem Telegramm https://t.me/nest_ru
Russischsprachiger Bericht über NestJS.

Und abonnieren Sie natürlich den Kanal im @ ngFanatic- Telegramm, in dem es Neuigkeiten über NestJS und Angular gibt.

PS: Dies ist nur ein Teil der Fähigkeiten von NestJS. Über eine einjährige persönliche Erfahrung wird es einen separaten Artikel geben.

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


All Articles