© Fona/Shutterstock.com
Das Framework Nest für moderne Webapplikationen mit Node.js

Ein gut gebautes Nest


Das von Angular inspirierte Nest ist ein noch relativ junges Framework für Node. js, mit dem skalierbare, serverseitige Anwendungen erstellt werden können. Unter der Haube verwendet Nest Express, bietet aber auch Kompatibilität zu einer Vielzahl anderer Bibliotheken. Das ermöglicht die einfache Verwendung von unzähligen Plug-ins von Drittanbietern, die verfügbar sind.

Wollen Sie eine Webapplikation mit Node.js umsetzen, führt kaum ein Weg an Express vorbei. Das führende Web-Application-Framework für Node.js erweitert das HTTP-Modul von Node.js um einige hilfreiche Features und nimmt Ihnen so einiges an Arbeit ab. Außerdem stellt Express mit seiner Middleware-Schnittstelle eine Möglichkeit zur Verfügung, über die Sie Erweiterungen in Ihre Applikation einbinden können. Mittlerweile ist Express jedoch in die Jahre gekommen und die Entwicklung des Frameworks hat an Schwung verloren. Einer der Hauptkritikpunkte ist, dass Express in der aktuellen Version 4 das native HTTP2-Modul von Node. js nicht unterstützt und Sie stattdessen auf ein zusätzliches NPM-Modul zurückgreifen müssen. Auch beim Einsatz moderner Design- und Architekturmuster wirkt Express zunehmend angestaubt, vor allem, wenn Sie die weit verbreiteten Frontend-Frameworks wie Angular, React oder Vue zum Vergleich heranziehen. Mit dieser Diskrepanz zwischen Backend und Frontend im Blick wurde Nest ins Leben gerufen. Dieses Framework bringt die modernen Entwicklungsparadigmen des Frontends in die Node.js-Welt. Zugleich nimmt Ihnen das Framework jede Menge Arbeit ab und lässt eine Applikation ähnlich strukturieren, wie Sie es beispielsweise von Angular gewohnt sind. In diesem Artikel erfahren Sie, wie Sie ein voll funktionsfähiges Backend für eine Single-Page-Applikation auf Basis von Nest implementieren können und wie sich mit diesem Framework gängige Problemstellungen schnell und einfach lösen lassen.

Die Idee hinter Nest

Nest verfolgt einen ähnlichen Ansatz wie schon Express, indem es keine Komplettlösung für die Umsetzung von Webapplikationen bietet, sondern einen modularen Ansatz verfolgt. Nest nutzt existierende Frameworks als Basis und erweitert diese. So kommt für die grundsätzliche Behandlung von Request und Response beispielsweise Express zum Einsatz. Die Schnittstelle ist allerdings so abstrahiert, dass Express auch gegen andere Frameworks ausgetauscht werden kann. Im Laufe dieses Artikels erfahren Sie, wie Sie mit Fastify eine Alternative zu Express in Ihre Applikation integrieren können.

Nest geht außerdem einen Schritt, der momentan sehr populär in der JavaScript-Welt ist, und nutzt TypeScript für die Entwicklung. Zwar ist es möglich, auch mit nativem JavaScript zu arbeiten, jedoch wird TypeScript empfohlen. Wo Sie in einer Express-Applikation gerade für die Routenkonfiguration einigen zusätzlichen Code schreiben mussten, nutzt Nest einen anderen Ansatz und geht von TypeScript-Klassen aus, die durch Decorators um Metainformationen ergänzt werden. Ein weiteres, auch aus dem Frontend bekanntes Muster, das in Nest häufig Anwendung findet, ist die Dependency Injection, mit der die einzelnen Bestandteile einer Applikation entkoppelt werden und eine bessere Testbarkeit erreicht wird.

Auch beim Set-up einer Applikation schlägt Nest einen bereits seit längerer Zeit im Frontend etablierten Weg ein und bietet Ihnen eine Hilfestellung bei der Initialisierung einer Applikation.

Installation und erste Schritte

Egal, ob Sie mit Angular, React oder Vue arbeiten, der erste Schritt ist stets das Set-up mit dem jeweiligen CLI. In Nest können Sie ebenfalls auf einen solchen Assistenten zum Initialisieren Ihrer Applikation zugreifen. Mit dem Kommando npm install -g @nestjs/cli installieren Sie das Nest CLI auf Ihrem System. Damit wird der Befehl nest auf der Kommandozeile verfügbar. Geben Sie nun nest new todo ein, wobei todo für den Namen der Applikation steht. Im Anschluss wird Ihnen eine Reihe von Fragen gestellt, so können Sie beispielsweise eine Beschreibung, die Versionsnummer und den Autor angeben. Außerdem haben Sie die Wahl zwischen NPM und Yarn als Packagemanager für Ihre Applikation. Zum Abschluss der Initialisierung werden noch die erforderlichen Abhängigkeiten installiert, danach können Sie direkt mit der Entwicklung starten.

Zum Starten der Applikation wechseln Sie in das im aktuellen Verzeichnis erstellte Verzeichnis mit dem Namen todo und führen den Befehl npm start aus. Bei der Initialisierung wurden einige NPM-Skripte für Sie angelegt. Der Befehl npm start sorgt beispielsweise dafür, dass Ihre Applikation mit ts-node gestartet wird. Dieses Werkzeug ermöglicht es Ihnen, TypeScript-Code direkt in Node.js auszuführen. Standardmäßig wird der Server auf Port 3000 gestartet, sodass Sie sich über den URL http://localhost:3000 mit Ihrer Applikation verbinden können. Der Nachteil bei dem normalen Start-Skript ist, dass Sie den Prozess bei jeder Änderung neu starten müssen. Während der Entwicklung ist das in den seltensten Fällen ein praktikabler Weg, sodass Sie stattdessen besser das Kommando npm run start:dev verwenden sollten. In diesem Fall kommt nodemon zum Einsatz, was dafür sorgt, dass der Serverprozess bei Änderungen automatisch neu gestartet wird. Für alle weiteren NPM-Skripte werfen Sie einen Blick in die Scripts-Sektion der package.json-Datei, die Sie im Wurzelverzeichnis Ihrer Applikation finden.

Der Quellcode der eigentlichen Applikation befindet sich im src-Verzeichnis. Hier werden Sie auch die meiste Zeit während der Entwicklung verbringen und Ihre eigenen Dateien ablegen. Die generierte Applikation besteht aus der Einstiegsdatei main.ts, die mit der create-Methode der NestFactory-Klasse das zentrale Modul Ihrer Applikation lädt. An diesem Modul hängen mit Controllern und Services weitere Bausteine der Applikation. Zunächst sei vorweggenommen, dass sich der Controller um das Routing und das Entgegennehmen des Requests kümmert und die Businesslogik in die Services ausgelagert werden sollte. Generell sollten Ihnen der Aufbau und die Struktur des Quellcodes bekannt vorkommen, wenn Sie schon einmal mit Angular gearbeitet haben. Das ist wenig verwunderlich, da Angular als Inspiration für Nest diente.

Module – eine Applikation organisieren

Den Kern einer Applikation bildet das zentrale Applikationsmodul. Ein solches Modul können Sie sich wie einen Container vorstellen, bei dem die Elemente der Applikation registriert werden, sodass Sie sie nutzen können. Werfen Sie einen Blick in die Datei app.module.ts, fällt Ihnen schnell die Verwendung des Decorators auf. Der @Module-Decorator fügt Metainformationen zur Modulklasse hinzu. Häufig ist eine solche Modulklasse bis auf den Decorator leer. Der Aufbau eines solchen Moduls orientiert sich stark an den Modulen von Angular im Frontend. Die Eigenschaften, die Sie im Modul setzen können, sind providers, controllers, imports und exports. Provider sind Strukturen, die Sie innerhalb Ihrer Applikation nutzen können. Sie werden sowohl zur Auslagerung von Businesslogik als auch zur Kommunikation innerhalb der Applikation verwendet. Der providers-Eigenschaft übergeben Sie ein Array der Provider-Klassen. Der controllers-Eigenschaft des Modul-Decorators weisen Sie ein Array von Controller-Klassen zu. Controller sind in einer Nest-Applikation dafür verantwortlich, eingehende Anfragen entgegenzunehmen und Antworten an den Client zu versenden. Die imports- und exports-Eigenschaft dient zur Strukturierung einer Applikation in mehrere Module. Mithilfe der imports-Eigenschaft können Sie ein Array von Modulen angeben, deren Provider Sie in Ihrer Applikation nutzen können. Mit der exports-Eigenschaft definieren Sie, welche Provider Sie anderen Modulen beim Import zur Verfügung stellen.

Bei kleineren Applikationen reicht normalerweise ein zentrales Applikationsmodul. Ist allerdings ein größerer Funktionsumfang zu erwarten, ist es sinnvoll, die Applikation in mehrere Module zu unterteilen. Ein solches...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang