Einführung in Nest.js: Je höher
Von Matthew Tyson
Softwarearchitekt, InfoWorld |
Nicht zu verwechseln mit Next.js, Nest.js ist ein neuerer und einzigartiger Ansatz für die JavaScript-Servertechnologie. Es benötigt einen bekannten Server wie Express oder Fastify und baut auf einer Reihe nützlicher Abstraktionen auf, die darauf ausgerichtet sind, das Anwendungsdesign auf höherer Ebene zu stärken und zu vereinfachen. Dank seiner besonderen Mischung aus Programmierparadigmen, erstklassiger TypeScript-Unterstützung und integrierten Funktionen wie der Abhängigkeitsinjektion erfreut sich Nest.js in den letzten Jahren stetig wachsender Beliebtheit.
Nest.js ist ein interessanter Beitrag zum JavaScript-Ökosystem und Ihre Aufmerksamkeit wert. Es ist ein großartiges Tool, das Sie bei der Arbeit mit serverseitigem JavaScript und TypeScript im Hinterkopf behalten sollten.
In diesem Artikel machen wir einen Rundgang durch Nest.js mit Beispielen wie Routing, Controllern, Produzenten (Abhängigkeitsinjektion) und Authentifizierung mit Wächtern. Sie erhalten außerdem einen Einblick in das Nest.js-Modulsystem.
Unser Beispiel ist eine Anwendung zum Verwalten einer Liste von Nudelrezepten. Wir werden einen abhängigkeitsinjizierten Dienst einschließen, der den tatsächlichen Datensatz verwaltet, und eine RESTful-API, mit der wir alle Rezepte auflisten oder ein einzelnes Rezept nach ID wiederherstellen können. Wir richten außerdem einen einfachen authentifizierten PUT-Endpunkt zum Hinzufügen neuer Rezepte ein.
Beginnen wir mit dem Gerüstbau für ein neues Projekt. Sobald wir das haben, können wir uns mit den Beispielen befassen.
Wir können die Nest.js-Befehlszeilenschnittstelle verwenden, um ein schnelles Anwendungslayout einzurichten, beginnend mit der globalen Installation von Nest mit: $ npm install -g @nestjs/cli. Zusätzlich zum Befehl „create“ enthält NestJS nützliche Funktionen wie „Generate“ zum Teilen wiederverwendbarer Designs. Durch die globale Installation haben wir Zugriff darauf und noch mehr.
Jetzt können wir eine neue Anwendung erstellen mit: $ nest new iw-nest. Sie können den gewünschten Paketmanager auswählen (npm, Yarn oder pnpm). Für diese Demo verwende ich pnpm. Der Vorgang ist unabhängig davon derselbe.
Wechseln Sie in das neue /iw-nest-Verzeichnis und starten Sie den Dev-Server mit: $ pnpm run start. Sie können überprüfen, ob die Anwendung ausgeführt wird, indem Sie localhost:3000 aufrufen. Dort sollte ein „Hello, World!“ angezeigt werden. Nachricht. Diese Nachricht kommt von iw-nest/src/app.controller.ts. Wenn Sie sich diese Datei ansehen, können Sie sehen, dass sie einen injizierten Dienst verwendet. Erstellen wir einen neuen Controller (src/recipes.controller.ts), der eine Liste von Rezepten zurückgibt, wie in Listing 1 gezeigt.
Listing 1 gibt uns einen Einblick in die Grundlagen des Routings in Nest.js. Wie Sie sehen, verwenden wir die Annotation @Controller('recipes'), um die Klasse als Controller mit der Route /recipes zu definieren. Die getRecipes()-Methode ist mit Anmerkungen versehen, um die GET-Methode mit @Get() zu verarbeiten.
Im Moment ordnet dieser Controller einfach das /recipes-GET einer hartcodierten Antwortzeichenfolge zu. Bevor Nest.js dies bereitstellt, müssen wir den neuen Controller beim Modul registrieren. Module sind ein weiteres wichtiges Konzept in Nest, das Ihnen bei der Organisation Ihres Anwendungscodes hilft. In unserem Fall müssen wir /src/app.module.ts öffnen und den Controller hinzufügen, wie in Listing 2 gezeigt.
Das Dependency-Injection-Framework in Nest.js erinnert an Spring im Java-Ökosystem. Allein die integrierte Abhängigkeitsinjektion macht Nest.js schon eine Überlegung wert, auch ohne den anderen Schnickschnack.
Wir werden einen Dienstanbieter definieren und ihn mit unserem Controller verbinden. Dies ist eine saubere Möglichkeit, die Anwendung in Ebenen zu organisieren. Sie können unsere neue Serviceklasse /src/recipes.service.ts in Listing 3 sehen.
Um diesen Dienstanbieter nutzen zu können, müssen wir ihn auch zur Datei app.module.ts hinzufügen, wie in Listing 4 gezeigt.
Module sind eine gute Möglichkeit, eine Bewerbung zu organisieren. Sie können als logischer Gruppierungsmechanismus fungieren und eine hierarchische Struktur bereitstellen, in der die grundlegendsten Module klar definiert sind und die anderen von ihnen abhängen.
Jetzt können wir den Dienst im RecipesController verwenden, wie in Listing 5 gezeigt. Wenn Sie mit der Abhängigkeitsinjektion noch nicht vertraut sind, scheint dies möglicherweise eine Menge zusätzlicher Arbeit zu sein. Aber die Möglichkeit, Klassen anwendungsweit und auf standardisierte Weise zu definieren und zu nutzen, kann für Ihre Anwendungsarchitektur ein echter Segen sein, wenn das System wächst.
Im Wesentlichen importieren wir die Klasse „RecipesService“ und verwenden dann die Annotation „@Inject()“ für das Member „recipesService“, um einen Verweis darauf zu erhalten. Das Injektionssystem verbindet dies basierend auf dem Typ mit einer Instanz der RecipesService-Klasse. Standardmäßig sind injizierte Dienste in Nest Singletons, sodass alle Clientklassen den Verweis auf dieselbe Instanz erhalten. Es ist möglich, andere „Bereiche“ für Dienste zu verwenden, um deren Instanziierung zu optimieren. Neben der Konstruktorinjektion unterstützt Nest die eigenschaftsbasierte Injektion.
Wenn Sie nun die Anwendung ausführen und zu „localhost:3000/recipes“ wechseln, sehen Sie die JSON-Ausgabe des Rezeptarrays im Dienst.
Fügen wir nun einen neuen POST-Endpunkt hinzu, damit Benutzer Rezepte hinzufügen können. Wir sichern es mit der einfachsten möglichen Authentifizierung mithilfe eines sogenannten Guards in Nest.js. Ein Wachmann sitzt vor den Controllern und bestimmt, wie die Anfragen weitergeleitet werden. Sie können unseren einfachen Wächter in Listing 6 sehen. Im Moment prüft er nur, ob die Anfrage einen Authentifizierungsheader enthält.
Als nächstes registrieren Sie den Guard beim Modul, wie in Listing 7 gezeigt.
Jetzt können wir den neuen Guard-Dienst verwenden, um unseren POST-Endpunkt zu schützen, wie in Listing 8 gezeigt. Beachten Sie die neuen Importe.
Beachten Sie, dass die Annotation @UserGuards verwendet wurde, um den neuen Schutz auf die Methode addRecipe() anzuwenden, die auch als POST-Endpunkt mit der Annotation @Post angegeben wird. Nest kümmert sich für uns um die Instanziierung und Anwendung des Schutzes am Endpunkt.
Wir haben dem Dienst auch eine addRecipe()-Methode hinzugefügt, die sehr einfach ist, wie in Listing 9 gezeigt.
Jetzt können wir die Authentifizierung und den Endpunkt mit ein paar CURL-Anfragen testen, wie in Listing 10.
Sie können sehen, dass die Autorisierung funktioniert, da nur eine Anfrage durchgelassen wird, die den Bearer-Header enthält.
Bisher haben wir nur ein JavaScript-Objekt verwendet. In der TypeScript-Welt wäre es üblich, ein Recipe-Modellobjekt zu erstellen und es als Wertobjekt zum Verschieben von Informationen zu verwenden. Beispielsweise könnten wir die Klasse Recipe erstellen (Listing 11) und sie in der Methode addRecipe verwenden (Listing 12).
Schließlich können Sie die POST-Methode addRecipe() stark typisieren und Next füllt das Modellobjekt automatisch für uns auf:
Anschließend können Sie die POST-Methode addRecipe() stark typisieren und Nest füllt das Modellobjekt automatisch für uns auf, wie in Listing 13 gezeigt.
Die Wahl zwischen der Flexibilität des Duck-Typings von JavaScript und dem Strong Typing von TypeScript hängt wirklich davon ab, wofür Sie, das Team oder die Organisation sich entscheiden. JavaScript ermöglicht Ihnen eine schnelle Entwicklung und Flexibilität, während TypeScript Ihnen Struktur und mehr Tool-Unterstützung bietet.
Es ist auch erwähnenswert, dass Nest.js reaktive Programmierung unterstützt und Sie Versprechen von Methoden und Endpunkten zurückgeben können. Darüber hinaus können Sie ein RxJS-Observable zurückgeben. Damit stehen Ihnen leistungsstarke Möglichkeiten für die Verkabelung von Anwendungen mit asynchronen Datenströmen zur Verfügung.
Obwohl wir nur an der Oberfläche dessen gekratzt haben, was es kann, ist es klar, dass Nest.js eine gut durchdachte und leistungsfähige Plattform für den Aufbau von Node-Servern ist. Es erfüllt das Versprechen einer übergeordneten Ebene auf Express für eine verbesserte Architektur- und Designunterstützung. Wenn Sie serverseitiges JavaScript und insbesondere TypeScript-Anwendungen erstellen möchten, ist Nest eine großartige Option.
Lesen Sie als nächstes Folgendes:
Matthew Tyson ist Gründer der Dark Horse Group, Inc. Er glaubt an Technologie, bei der der Mensch im Mittelpunkt steht. Wenn Matt nicht gerade Gitarre spielt, erkundet er das Hinterland und das philosophische Hinterland. Seit 2007 schreibt er für JavaWorld und InfoWorld.
Copyright © 2023 IDG Communications, Inc.
Lesen Sie als nächstes Folgendes: