Friedrich Siever

9. Januar 2024

Nest.js Resource Controller: Der einfache Einstieg

von: Friedrich Siever | Last Updated: 09.01.24

Nest.js Resource Controller: Einblicke und Grundlagen

Nachdem wir in einem einführenden Beitrag zu Nest Controllern erklärt haben, was Controller in Nest.js sind, gehen wir in diesem Artikel einen Schritt weiter und widmen uns dem Konzept des Resource Controllers.

Um zu verdeutlichen, was eine Resource ist oder sein kann, werfen wir einen Blick auf eine mögliche Anwendung für ein Maschinenbauunternehmen, das an verschiedenen Messen teilnimmt und sein Messemarketing in einer App organisieren möchte. Die Resourcen könnten dabei wie folgt aussehen:

  • Messe
  • User
  • MesseTeilnehmer

Anders ausgedrückt: Die Datenbankentitäten (Tabellen) entsprechen oft den Resourcen in unseren Apps. Zumindest sind sie hervorragende Kandidaten.

Jede Resource kann nun eine Reihe von Operationen haben, die auf sie durchgeführt werden können. Zum Beispiel in einer CRUD-App:

  • Create → POST
  • Read → GET
  • Update → PATCH/PUT
  • Delete → DELETE

Implementation

In Nest.js gibt es verschiedene Möglichkeiten, einen Resource Controller zu implementieren. Zunächst zeige ich dir den manuellen Weg. Obwohl dir NestJS CLI helfen kann, den Code für den Controller zu erstellen, verschieben wir dies auf später.

Erstelle zunächst in deinem /src-Ordner eine Datei mit dem Namen exhibition.controller.ts.

Eine mögliche Implementierung könnte damit beginnen, dass wir eine Klasse exportieren. Die Decorators für den Controller und die einzelnen HTTP-Verben importieren wir aus dem Nest.js-Namespace. Für eine CRUD-Anwendung erstellen wir die Methoden in Kombination mit den Decorators.

Der folgende Code verdeutlicht den Aufbau. Ich empfehle dir, dies ein oder zwei Mal manuell aufzubauen, damit die Strukturierung zur Gewohnheit wird.

// src/exhibitions.controller.ts
import { Controller, Get, Post, Patch, Delete } from "@nestjs/common";

NestController("exhibitions");
export class ExhibitionsController {
  @Get()
  findAll() {
    // Implementiere die Logik, um alle Ausstellungen abzurufen
  }

  @Get(":id")
  findOne() {
    // Implementiere die Logik, um eine Ausstellung anhand der ID abzurufen
  }

  @Post()
  create() {
    // Implementiere die Logik, um eine neue Ausstellung zu erstellen
  }

  @Patch(":id")
  update() {
    // Implementiere die Logik, um eine Ausstellung anhand der ID zu aktualisieren
  }

  @Delete(":id")
  remove() {
    // Implementiere die Logik, um eine Ausstellung anhand der ID zu löschen
  }
}

Routenparameter

Du hast sicherlich die Parameter bemerkt, genauer gesagt den id-Parameter. Insgesamt sind in unserem obigen Beispiel 5 Routen definiert. Einige davon benötigen jedoch einen Identifikator für die Messe, um entsprechende Aktionen durchzuführen. In unserem Beispiel sind das:

  • findOne
  • update
  • remove

Dies sind die Aktionen, bei denen eine Messeveranstaltung genau spezifiziert werden muss. In Nest.js können wir dies durch Routen realisieren, die dynamische Teile haben.

Zum Beispiel wird findOne nur ausgelöst, wenn ein Nutzer eine URL eingibt, die so aussehen könnte: /exhibitions/1. Wenn die URL /exhibitions aufgerufen wird, wird die findAll()-Methode aufgerufen. Um diesen sogenannten “Routeparameter” der ID zu nutzen, musst du ihn zusammen mit einem @Param-Decorator aufrufen, der den Routeparameter als Argument enthält.

import { Controller, Delete, Get, Param, Patch, Post } from "@nestjs/common";
@Controller("/exhibitions")
export class ExhibitionsController {
  // ...
  @Get(":id")
  findOne(@Param("id") id) {
    return id;
  }
  // ...
}

Jetzt, um diese Lektion abzurunden, probiere die Funktionalität der Routenparameter in deinem Browser aus. Besuche einfach die folgenden URLs:

Bonus-Tipp: Wenn du mehr als nur einen einzelnen Routenparameter verwenden möchtest, gibt es einen sehr hilfreichen Shortcut. Der @Param-Decorator ohne einen spezifischen Parameter gibt ein Objekt mit den Parameterwerten zurück. Hier ist ein Beispiel:

import { Controller, Delete, Get, Param, Patch, Post } from "@nestjs/common";
@Controller("/exhibitions")
export class ExhibitionsController {
  // ...
  @Get(":id")
  findOne(@Param() id) {
    return id;
  }
  // ...
}

Routenparameter - Zusammenfassung

  • Routen können dynamische Teile enthalten, die als “Route Parameter” bezeichnet werden.
  • Route Parameter werden durch einen Doppelpunkt gefolgt vom Parameternamen definiert.
  • Die Parameter werden an die Aktionen über den @Param-Decorator übergeben.

Registrieren von Controllern in Nest

Ein unverzichtbarer Schritt besteht darin, einen frisch erstellten Controller in unserem Nest.js-Modul zu registrieren. Hierfür fügen wir ihn dem Array der Controller in der Datei app.module.ts hinzu.

// app.module.ts
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { ExhibitionsController } from "./exhibition.controller"; // <-

@Module({
  imports: [],
  controllers: [AppController, ExhibitionsController], // <-
  providers: [AppService],
})
export class AppModule {}

Obwohl wir bisher noch nichts Aufregendes generiert haben, kannst du nun die verschiedenen Methoden auf den Routen ausführen. Nutze dazu ein Tool wie Postman oder Insomnia und teste die URLs:

Du wirst auf den im Controller spezifizierten Routen mit den verschiedenen Methoden stets eine positive HTTP-Response (Statuscode 200) erhalten.

Fazit

Zum Abschluss möchte ich einige bewährte Tipps teilen, die sich in der Praxis als nützlich erwiesen haben:

  • Halte deine Controller möglichst klein und erstelle sie im Kontext deiner Resourcen (Entitäten).
  • Versuche, deine Controller schlank zu halten, und sie sollten nicht mehr als 5 CRUD-Operationen enthalten.
  • Wenn du versucht bist, weitere Aktionen hinzuzufügen, könnte es besser sein, eine neue Resource zu erstellen.
  • Nutze Decorators wie @Get oder @Post, um die HTTP-Verben und den Pfad der Operation zu definieren.
  • Benenne deine Aktionen in einer beschreibenden Art und Weise. Bei CRUD-Controllern kannst du deine Aktionen immer gleich benennen, was dir das Leben erleichtert.
0
0 Bewertungen

Jetzt selbst bewerten