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.
Aufgabe
EinfachDieser 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.
- Markiere in
src/tasks/tasks.service.tsdie KlasseTasksServicemit@Injectable()aus@nestjs/common. So kann Nest die Klasse erstellen und weitergeben. - 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 inthis.tasks), diesem Titel unddone: false. Sie fügt die Aufgabe zuthis.taskshinzu und gibt sie zurück. Der Controller ruft sie beiPOST /tasksmit dem Titel aus dem Anfragetext auf. - Schreibe eine Methode
remove(id), wobeiideine Zahl ist. Wenn keine Aufgabe diese ID hat, muss die Methode wiefindOnemit 404 antworten: Rufe zuerstthis.findOne(id)auf, wodurch ein Fehler ausgelöst wird. Entferne danach die Aufgabe austhis.tasks. Die Methode gibt nichts zurück. - Importiere in
src/tasks/tasks.module.tsTasksServiceaus./tasks.service. Füge dann nebencontrollerseine Listeproviderszum Modul hinzu und trageTasksServicedarin ein. Nest erstellt nur die Klassen, die ein Modul dort auflistet. - Ersetze in
src/tasks/tasks.controller.tsden Kommentar innerhalb vonTasksControllerdurch einen Konstruktor mit einem Parameter, geschrieben alsprivate readonly tasksService: TasksService. Nest erkennt den TypTasksServiceund übergibt seinen einen Service. Die Wörterprivate readonlyvor 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).
}
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