Eine Einführung in Nest.js

Seite 3: Module zur Organisation der Fachlichkeit

Inhaltsverzeichnis

Bei einem Modul handelt es sich um eine Sammlung von thematisch zusammengehörigen Elementen. Um es zu erzeugen, können Entwickler den Befehl nest g mo user nutzen. Das Modul befindet sich im User-Verzeichnis in der Datei user.module.ts. Im Kern handelt es sich um eine TypeScript-Klasse, die mit einem Decorator versehen ist. Die Decorator fügen zusätzliche Informationen zur Klasse hinzu. Über den Decorator können Nutzer insgesamt vier Informationen übergeben:

  • controllers: Die Controller eines Moduls sind die Einstiegspunkte für die Clients. Sie kümmern sich darum, aus einer eingehenden Anfrage eine Antwort zu erzeugen.
  • providers: Die Provider fassen die Services des Moduls zusammen.
  • imports: Listet die Module auf, deren Features das aktuelle Modul benötigt.
  • exports: Die exports-Eigenschaft definiert die Provider, die man über den Import des Moduls in andere Modulen einbinden kann.

Module sind ein Mittel zur Strukturierung der Applikation, sie enthalten nur wenig bis keine Applikationslogik. Der wirkliche Einstieg in die Applikation sind die Controller.

Im User-Modul legen Entwickler nach der Initialisierung der Applikation den User-Controller mit[ i]nest g co user[/i] an. Der Befehl erzeugt im user-Verzeichnis die beiden Dateien user.controller.ts und user.controller.spec.ts. Die zweite Datei enthält einen vorgefertigten Test für den Controller, der auf dem Test-Framework Jest basiert.

Den Controller registriert man im User-Modul. Das macht ihn aktiv und bereit für den Einsatz. Im Controller befindet sich der @Controller-Decorator, der die Route als Zeichenkette erhält. Die Controller-Klasse ist nur ein Teil der Struktur, die zum Erzeugen des neuen Datensatzes erforderlich ist. Die Methoden der Klasse kommen zum Einsatz, um mit den eingehenden Anfragen umzugehen. Dazu dienen wiederum Decorator.

Der Name der Methode spielt bei den Funktionen keine Rolle, man kann sie beliebig benennen. Man sollte ihn allerdings so wählen, dass er Rückschlüsse auf den Zweck der Methode zulässt. Der wirklich relevante Teil ist der verwendete Decorator. Zur Erzeugung eines neuen Datensatzes dient der @Post-Decorator. Nest unterstützt ebenfalls weitere Decorator, die den Namen von HTTP-Methoden wie Get, Put oder Deletetragen. Ihnen können Anwender einen weiteren Pfad als Zeichenketten übergeben. Darin können auch, durch einen Doppelpunkt eingeleitet, Variablen enthalten sein. Innerhalb der Controller-Methode kann man dann auf den Teil des URL-Pfads zugreifen.

Zurück zum Anlegen des Benutzeraccounts: Bei einer HTTP-Post-Anfrage werden die Informationen über den Datensatz üblicherweise im Body der Anfrage übergeben. Um darauf zugreifen zu können, kommt der @Body-Decorator in der Parameterliste der Methode zum Einsatz. Er erweitert den nachfolgenden Parameter dahingehend, dass er mit den Informationen aus dem Body der Anfrage bestückt wird. Da Nest auf TypeScript basiert, können Entwickler außerdem angegeben, welchen Objekttyp der Body der Nachricht haben soll.

Die Controller-Methode sollte nicht über allzu viel Funktionalität verfügen. Deshalb empfiehlt es sich, die weitere Logik, die zum Anlegen des Benutzers nötig ist, in einen Service auszulagern. Diesen bindet die Dependency Injection von Nest in den Controller ein. Geht man davon aus, dass es einen UserService gibt, der über eine addUser-Methode verfügt, führt das zu folgendem Quellcode für den Controller.

import { Controller, Body, Post } from '@nestjs/common';
import { UserService } from './user.service';

@Controller('user')
export class UserController {
constructor(private userService: UserService) {}

@Post()
addQuiz(@Body() body: User) {
return this.userService.addUser(body);
}
}

Die Dependency Injection ist als Constructor-Injection implementiert. Zunächst gibt man den Zugriffsmodifikator für die Eigenschaft an, gefolgt vom Namen und schließlich dem Typ der Eigenschaft. Im Falle eines zu injizierenden Services ist das die Klasse des Services. Nest prüft danach, ob es bereits eine Instanz des Services gibt, legt bei Bedarf eine neue an und stellt anschließend die Instanz über die Eigenschaft des Controllers zur Verfügung.

In der addUser-Methode des Controllers führt Nest die addUser-Methode des Services aus. Das return-Statement sorgt dafür, dass der Rückgabewert des Services die Antwort an den Client darstellt. Eine Besonderheit ist die Unterstützung sowohl synchroner als auch asynchroner Rückmeldungen. Liefert der Service beispielsweise ein Promise-Objekt zurück, wartet Nest mit der Antwort an den Client, bis es gelöst ("resolved") oder abgelehnt ("rejected") ist. Der Service kümmert sich dann um die eigentlichen Aufgaben im Zusammenhang mit der Erzeugung des Datensatzes.