Un servizio
Fa parte della sezione TypeScript e NestJS del percorso Node.js di Coddy. Lezione 9 di 24.
Il controller contiene direttamente le attività, quindi nessun'altra parte dell'app può accedervi. I dati e la logica appartengono a un provider: una classe che Nest crea e consegna a chiunque la richieda.
@Injectable()
export class BooksService {
private books = [{ title: 'Dune' }];
}
@Controller('books')
export class BooksController {
constructor(private readonly booksService: BooksService) {}
}@Injectable() contrassegna la classe e il modulo la elenca in providers. Una classe la richiede indicandola nel proprio costruttore: questa è l'iniezione delle dipendenze. private readonly davanti al parametro è una scorciatoia di TypeScript: crea un campo this.booksService e vi memorizza ciò che Nest passa. Nest legge il tipo del parametro, che il compilatore conserva per le classi decorate, crea un'unica istanza per il modulo che la elenca e passa la stessa istanza a ogni classe di quel modulo che la richiede. I dati sono condivisi e un test può passare al suo posto un oggetto fittizio.
Questa lezione inizia con il controller che chiama già this.tasksService.
Sfida
FacileQuesto passaggio apre il progetto preparato del tracker di attività Nest del corso, anziché i file del tuo progetto di Codici di stato ed errori (incluso src/tasks/tasks.controller.ts). Il lavoro precedente rimane nella sua lezione. Leggi i file forniti prima di modificare src/tasks/tasks.service.ts. Questa copia contiene le route Nest per le attività e il controller è già predisposto per delegare a un service.
Le attività si trovano all'interno del controller, quindi nessun'altra parte dell'app può accedervi. Spostale in un service: una classe che gestisce le attività, che Nest crea una sola volta e fornisce a ogni classe che ne fa richiesta. Il controller è già stato riscritto per chiamare il service. Il tuo compito è completare il service e collegare i due.
- In
src/tasks/tasks.service.ts, contrassegna la classeTasksServicecon@Injectable(), da@nestjs/common. Questo permette a Nest di crearla e fornirla. - Nella stessa classe, scrivi un metodo
create(title). Crea un'attività con il prossimo id libero (uno in più rispetto all'id più grande inthis.tasks), quel titolo edone: false. Aggiunge l'attività athis.taskse la restituisce. Il controller chiama il metodo con il titolo contenuto nel corpo della richiesta perPOST /tasks. - Scrivi un metodo
remove(id), doveidè un numero. Se nessuna attività ha quell'id, deve rispondere con 404, comefindOne: chiama primathis.findOne(id), che genera un'eccezione. Poi rimuovi l'attività dathis.tasks. Non restituisce nulla. - In
src/tasks/tasks.module.ts, importaTasksServiceda./tasks.service, poi aggiungi al modulo un elencoproviders, accanto acontrollers, e inserisciciTasksService. Nest crea solo le classi elencate lì dal modulo. - In
src/tasks/tasks.controller.ts, sostituisci il commento all'interno diTasksControllercon un costruttore che accetta un parametro, scrittoprivate readonly tasksService: TasksService. Nest riconosce il tipoTasksServicee passa il suo service. Le paroleprivate readonlydavanti a un parametro creano anche un campo,this.tasksService, che contiene il valore passato. È il nome che i metodi qui sotto usano già.
Prova: invia POST con { "title": "Buy milk" } a /tasks. Ottieni 201 e:
{ "id": 4, "title": "Buy milk", "done": false }Invia GET /tasks: quattro attività, con Buy milk per ultima. Invia DELETE /tasks/4: 204. Invia DELETE /tasks/99: 404 con "message": "Task 99 not found".
Provalo tu
import { NotFoundException } from '@nestjs/common';
export interface Task {
id: number;
title: string;
done: boolean;
createdAt?: string;
}
// Rendi questa classe un provider che Nest possa iniettare.
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;
}
// Scrivi create(title) e remove(id) qui.
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di TypeScript e NestJS
Esercitati da solo: Playground Express