Menu
CoddyTech

Ein Service

Teil des Abschnitts TypeScript und NestJS der Node.js-Journey von Coddy. Lektion 9 von 24.

Der Controller enthält die Aufgaben selbst, sodass kein anderer Teil der App darauf zugreifen kann. Daten und Logik gehören in einen Provider: eine Klasse, die Nest erstellt und jedem übergibt, der danach fragt.

@Injectable()
export class BooksService {
    private books = [{ title: 'Dune' }];
}

@Controller('books')
export class BooksController {
    constructor(private readonly booksService: BooksService) {}
}

@Injectable() kennzeichnet die Klasse, und das Modul führt sie unter providers auf. Eine Klasse fordert sie an, indem sie sie in ihrem Konstruktor benennt: Das ist Dependency Injection. private readonly vor dem Parameter ist eine TypeScript-Kurzschreibweise: Sie erstellt ein Feld this.booksService und speichert darin, was Nest übergibt. Nest liest den Parametertyp, den der Compiler für dekorierte Klassen beibehält, erstellt eine Instanz für das Modul, in dem sie aufgeführt ist, und übergibt dieselbe Instanz an jede Klasse dort, die danach fragt. Die Daten werden gemeinsam genutzt, und ein Test kann stattdessen ein Fake übergeben.

Diese Lektion beginnt damit, dass der Controller bereits this.tasksService aufruft.

challenge icon

Aufgabe

Einfach

Dieser Schritt öffnet das vorbereitete Nest-Projekt zur Aufgabenverwaltung des Kurses und nicht deine Projektdateien aus Statuscodes und Fehler (einschließlich src/tasks/tasks.controller.ts). Deine frühere Arbeit bleibt in ihrer eigenen Lektion. Lies die bereitgestellten Dateien, bevor du src/tasks/tasks.service.ts bearbeitest. Diese Kopie enthält die Nest-Routen für Aufgaben. Der Controller ist so vorbereitet, dass er Aufrufe an einen Service weiterleitet.

Die Aufgaben befinden sich im Controller, sodass kein anderer Teil der App darauf zugreifen kann. Verschiebe sie in einen Service: eine Klasse, die die Aufgaben verwaltet und die Nest einmal erstellt und jeder Klasse übergibt, die danach fragt. Der Controller wurde bereits so umgeschrieben, dass er den Service aufruft. Deine Aufgabe ist es, den Service fertigzustellen und beide miteinander zu verbinden.

  1. Markiere in src/tasks/tasks.service.ts die Klasse TasksService mit @Injectable() aus @nestjs/common. So kann Nest die Klasse erstellen und weitergeben.
  2. Schreibe in derselben Klasse eine Methode create(title). Sie erstellt eine Aufgabe mit der nächsten freien ID (eins mehr als die größte ID in this.tasks), diesem Titel und done: false. Sie fügt die Aufgabe zu this.tasks hinzu und gibt sie zurück. Der Controller ruft sie bei POST /tasks mit dem Titel aus dem Anfragetext auf.
  3. Schreibe eine Methode remove(id), wobei id eine Zahl ist. Wenn keine Aufgabe diese ID hat, muss die Methode wie findOne mit 404 antworten: Rufe zuerst this.findOne(id) auf, wodurch ein Fehler ausgelöst wird. Entferne danach die Aufgabe aus this.tasks. Die Methode gibt nichts zurück.
  4. Importiere in src/tasks/tasks.module.ts TasksService aus ./tasks.service. Füge dann neben controllers eine Liste providers zum Modul hinzu und trage TasksService darin ein. Nest erstellt nur die Klassen, die ein Modul dort auflistet.
  5. Ersetze in src/tasks/tasks.controller.ts den Kommentar innerhalb von TasksController durch einen Konstruktor mit einem Parameter, geschrieben als private readonly tasksService: TasksService. Nest erkennt den Typ TasksService und übergibt seinen einen Service. Die Wörter private readonly vor einem Parameter erstellen außerdem ein Feld, this.tasksService, in dem der übergebene Wert gespeichert wird. Diesen Namen verwenden die Methoden weiter unten bereits.

Probiere es aus: Sende POST mit { "title": "Buy milk" } an /tasks. Du erhältst 201 und:

{ "id": 4, "title": "Buy milk", "done": false }

Sende GET /tasks: vier Aufgaben, wobei Buy milk die letzte ist. Sende DELETE /tasks/4: 204. Sende DELETE /tasks/99: 404 mit "message": "Task 99 not found".

Probier es selbst

import { NotFoundException } from '@nestjs/common';

export interface Task {
    id: number;
    title: string;
    done: boolean;
    createdAt?: string;
}

// Mache diese Klasse zu einem Provider, den Nest injizieren kann.
export class TasksService {
    private tasks: Task[] = [
        { id: 1, title: 'Write the README', done: true, createdAt: '2026-01-05T09:00:00.000Z' },
        { id: 2, title: 'Fix the login bug', done: false, createdAt: '2026-01-06T14:30:00.000Z' },
        { id: 3, title: 'Plan the sprint', done: false, createdAt: '2026-01-07T08:15:00.000Z' },
    ];

    findAll(done?: string): Task[] {
        if (done === undefined) {
            return this.tasks;
        }
        return this.tasks.filter((task) => task.done === (done === 'true'));
    }

    findOne(id: number): Task {
        const task = this.tasks.find((task) => task.id === id);
        if (!task) {
            throw new NotFoundException(`Task ${id} not found`);
        }
        return task;
    }

    // Schreibe hier create(title) und remove(id).
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in TypeScript und NestJS

Übe selbstständig: Express-Playground