Menu
CoddyTech

Um serviço

Parte da seção TypeScript e NestJS do Journey de Node.js da Coddy. Lição 6 de 17.

O controlador mantém as próprias tarefas, então nenhuma outra parte do app consegue acessá-las. Os dados e a lógica pertencem a um provedor: uma classe que o Nest cria e entrega a quem a solicita.

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

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

@Injectable() marca a classe, e o módulo a lista em providers. Uma classe solicita o provedor ao nomeá-lo em seu construtor: isso é injeção de dependência. O Nest lê o tipo do parâmetro, que o compilador mantém para classes decoradas, cria uma instância para todo o app e passa essa mesma instância a cada classe que a solicita. Os dados são compartilhados, e um teste pode passar uma implementação falsa no lugar.

Esta lição começa com o controlador já chamando this.tasksService.

challenge icon

Desafio

Fácil
  • Torne TasksService injetável, dê a ele create(title) e remove(id), o trabalho que seu controller fazia na lição 5, e liste-o em providers de TasksModule.
  • Solicite-o no construtor de TasksController.
  • Envie POST /tasks com { "title": "Buy milk" }, depois GET /tasks e, em seguida, DELETE /tasks/99.

Experimente você mesmo

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

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

// Torne esta classe um provider que o Nest possa injetar.
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;
    }

    // Mova a lógica de criação e remoção do controller para cá.
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de TypeScript e NestJS