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.
Desafio
Fácil- Torne
TasksServiceinjetável, dê a elecreate(title)eremove(id), o trabalho que seu controller fazia na lição 5, e liste-o emprovidersdeTasksModule. - Solicite-o no construtor de
TasksController. - Envie
POST /taskscom{ "title": "Buy milk" }, depoisGET /taskse, 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á.
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.