Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Questo 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.

  1. In src/tasks/tasks.service.ts, contrassegna la classe TasksService con @Injectable(), da @nestjs/common. Questo permette a Nest di crearla e fornirla.
  2. Nella stessa classe, scrivi un metodo create(title). Crea un'attività con il prossimo id libero (uno in più rispetto all'id più grande in this.tasks), quel titolo e done: false. Aggiunge l'attività a this.tasks e la restituisce. Il controller chiama il metodo con il titolo contenuto nel corpo della richiesta per POST /tasks.
  3. Scrivi un metodo remove(id), dove id è un numero. Se nessuna attività ha quell'id, deve rispondere con 404, come findOne: chiama prima this.findOne(id), che genera un'eccezione. Poi rimuovi l'attività da this.tasks. Non restituisce nulla.
  4. In src/tasks/tasks.module.ts, importa TasksService da ./tasks.service, poi aggiungi al modulo un elenco providers, accanto a controllers, e inseriscici TasksService. Nest crea solo le classi elencate lì dal modulo.
  5. In src/tasks/tasks.controller.ts, sostituisci il commento all'interno di TasksController con un costruttore che accetta un parametro, scritto private readonly tasksService: TasksService. Nest riconosce il tipo TasksService e passa il suo service. Le parole private readonly davanti 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.
}
quiz iconMettiti alla prova

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