Treffen Sie NestJS

Vor dem Start des Node.js Developer- Kurses wurde eine Übersetzung des Artikels erstellt .




Moderne Entwickler haben viele Alternativen, wenn es darum geht, Webdienste und andere Serveranwendungen zu erstellen. Der Knoten ist zu einer äußerst beliebten Wahl geworden. Viele Programmierer bevorzugen jedoch eine robustere Sprache als JavaScript, insbesondere diejenigen, die aus modernen objektorientierten Sprachen wie C #, C ++ oder Java stammen. Wenn TypeScript genau zu NodeJS passt, setzt das NestJS-Framework neue Maßstäbe und bietet dem Backend-Entwickler moderne Tools zum Erstellen dauerhafter und leistungsstarker Anwendungen mit Komponenten, Anbietern, Modulen und anderen nützlichen Abstraktionen auf hoher Ebene.

In diesem Artikel werden wir uns mit dem Erstellen eines einfachen API-Servers in NestJS befassen, um das grundlegende Anwendungsszenario zu verarbeiten: Erstellen, Speichern und Abrufen einer Liste von Supermarktprodukten.
Wenn Sie sich mit dem Quellcode des Projekts vertraut machen möchten, finden Sie ihn hier .

Projekterstellung


Um mit Nest arbeiten zu können, benötigen Sie eine Knotenumgebung. Wenn Sie es noch nicht haben, besuchen Sie die Website und laden Sie es herunter.

Die Installation des Frameworks ist ganz einfach:

$ npm i -g @nestjs/cli

Dieses Projekt wurde mithilfe der Nest-CLI erstellt, nachdem der folgende Befehl ausgeführt wurde:

$ nest new nest-js-example

Ein solches Team erstellt ein komplett neues Nest-Projekt mit den erforderlichen Konfigurationsdateien, der Ordnerstruktur und der Servervorlage.

Anwendungseinstiegspunkt


Die Hauptdatei, die den Server konfiguriert und startet, lautet src/main.ts:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
	
    const app = await NestFactory.create(AppModule);
    await app.listen(3000);
}

bootstrap();

Diese Datei importiert die NestFactory- Klasse , mit der die Anwendung erstellt wird, und die Haupt- AppModule- Datei (die wir bald kennenlernen werden). Anschließend wird die Anwendung heruntergeladen, instanziiert und Port 3000 überwacht .

App-Modul


Die Datei, in der die Anwendungskomponenten deklariert sind, heißt src/app.module.ts:

import { Module } from '@nestjs/common';
import { ItemsController } from './items/items.controller';
import { ItemsService } from './items/items.service';

@Module({
    imports: [],
    controllers: [ ItemsController ],
    providers: [ ItemsService ],
})

export class AppModule {}

Dies ist die Datei, in die die anderen Komponenten importiert und im Modul deklariert werden, das in die vorherige Datei ( main.ts ) importiert wird . Die Nest CLI- Tools aktualisieren diese Datei automatisch nach Bedarf, wenn Sie angewiesen werden, eine neue Komponente zu erstellen. Hier werden der Controller und der Service für Artikel importiert und dem Modul hinzugefügt.

Items Controller


Die nächste Datei, die wir überprüfen werden, ist src/items/items.controller.ts:

import { Controller, Req, Get, Post, Body } from '@nestjs/common'
import { CreateItemDto } from './dto/create-item.dto'
import { ItemsService } from './items.service'
import { Item } from './items.interface'

@Controller('items')
export class ItemsController {

    constructor(private readonly itemsService: ItemsService) {}

    @Post()
    create(@Body() data: CreateItemDto): Object {
        return this.itemsService.create(data)
    }

    @Get()
    findAll(): Array<Item> {
        return this.itemsService.findAll()
    }
}

Diese Datei definiert den Controller zum Erstellen von Elementen und zum Abrufen einer Liste zuvor erstellter Elemente . Hier werden mehrere Schlüsselkomponenten importiert:

  • CreateItemDto : Ein Datenübertragungsobjekt , das definiert, wie Elementdaten über das Netzwerk gesendet werden (d. H. Dies ist eine JSON-Datenstruktur).
  • ItemsService: Provider , dass Griffe der Manipulation oder Speicherung von Artikeldaten ;
  • Item : Eine Schnittstelle, die die interne Datenstruktur für Item definiert .

Der Dekorator @Controller('items')teilt dem Framework mit, dass diese Klasse den REST / items- Endpunkt bedient , und der ItemsController- Konstruktor verwendet eine Instanz von ItemsService , die intern verwendet wird, um zwei HTTP-Methoden zu bedienen:

  • POST / items (erstellt ein neues Element aus einer JSON-Anforderung);
  • GET / items (Abrufen einer Liste zuvor erstellter Elemente).

Anforderungen für diese beiden Methoden werden von den Methoden create und FindAll verarbeitet, die mit den Dekoratoren @Post()und an die entsprechenden HTTP-Methoden gebunden sind @Get(). Zusätzliche Methoden können beispielsweise auch von Dekorateuren auf ähnliche Weise unterstützt werden, @Put()oder @Delete()usw.

Element Objektschnittstellen


Als Nächstes werden zwei Dateien behandelt, die Schnittstellen zum Speichern von Elementen definieren , eine für den internen Gebrauch, z. B. die Typprüfung zur Kompilierungszeit ( Element ), und eine externe Schnittstelle zum Bestimmen der erwarteten Struktur des eingehenden JSON ( CreateItemDto):

export interface Item {
	
    name: string,
    description: string,
    price: number
}

export class CreateItemDto {

    @IsNotEmpty()
    readonly name: string;

    @IsNotEmpty()
    readonly description: string;

    @IsNotEmpty()
    readonly price: number;
}

Die Artikelschnittstelle definiert drei Eigenschaften eines regulären Geschäftsprodukts: Name, Beschreibung und Preis. Dies stellt sicher, dass in der Anwendungsarchitektur keine Verwirrung darüber besteht, was ein Element ist und welche Eigenschaften es hat.

Die CreateItemDto- Klasse spiegelt die Item- Eigenschaften wider und dekoriert jede Eigenschaft, @IsNotEmpty()um sicherzustellen, dass alle diese Eigenschaften vom REST-API-Endpunkt angefordert werden.

Alle Eigenschaften beider Klassen sind stark typisiert, was einer der Hauptvorteile von TypeScript ist (daher der Name). Auf den ersten Blick erhöht dies das Verständnis des Kontexts und verkürzt die Entwicklungszeit erheblich, wenn es korrekt mit Code-Analyse-Tools (wie IntelliSense in VSCode) verwendet wird. Dies gilt insbesondere für große Projekte mit Hunderten oder sogar Tausenden verschiedener Klassen und Schnittstellen. Für diejenigen, die kein perfektes fotografisches Gedächtnis mit unendlicher Kapazität haben (zum Beispiel für mich), ist es viel einfacher, als sich Tausende spezifischer Details zu merken.

Artikel Service


Der neueste ist ein Dienst zum Erstellen und Empfangen von items: items.service.dart:

import { Injectable } from '@nestjs/common'
import { Item } from './items.interface'

@Injectable()
export class ItemsService {

    private items: Array<Item> = []

    create(item: Item): Object {

        this.items.push(item) 
        return { id: this.items.length.toString() }
    }

    findAll(): Array<Item> {

        return this.items;
    }
}

Die ItemsService- Klasse definiert ein einfaches Array von Item- Objekten , die als speicherinterner Datenspeicher für unser Beispielprojekt dienen. Zwei Methoden, die aus diesem Repository schreiben und lesen, sind:

  • create (speichert Item in der Liste und gibt seine ID zurück);
  • findAll (eine Liste von zuvor erstellten Artikel Objekte ).

Testen


Verwenden Sie zum Starten des Servers den Standardbefehl npm run start . Wenn die Anwendung gestartet wird, kann sie getestet werden, indem HTTP-Anforderungen über CURL gesendet werden :

$ curl -X POST localhost:3000/items -d '{"name":"trinket", "description":"whatever", "price": 42.0}'

Wenn Sie diesen Befehl ausführen, wird eine JSON-Antwort mit der vom Element generierten ID zurückgegeben . Verwenden Sie Folgendes, um eine Liste der bereits erstellten Elemente anzuzeigen:

$ curl localhost:3000/items

Die GET-Anforderung an / items oben gibt eine JSON-Antwort mit Informationen zu den Elementen zurück , die sich bereits im Speicher befinden. Die Antwort sollte ungefähr so ​​aussehen:

[{"{\"name\":\"trinket\", \"description\":\"whatever\", \"price\": 42.0}":""}]

Fazit


NestJS ist eine relativ neue Lösung im Bereich der Backend-Entwicklung mit einer Vielzahl von Funktionen zum schnellen Erstellen und Bereitstellen von Unternehmensdiensten, die den Anforderungen moderner Anwendungsclients entsprechen und den Prinzipien von SOLID und der Anwendung von zwölf Faktoren entsprechen .

Weitere Informationen finden Sie auf der NestJS- Website .
Vielen Dank für das Lesen meines Artikels. Viel Spaß beim Codieren!

All Articles