Menu
CoddyTech

Un servicio

Parte de la sección TypeScript y NestJS del Journey de Node.js de Coddy. Lección 6 de 17.

El controlador contiene las tareas, por lo que ninguna otra parte de la aplicación puede acceder a ellas. Los datos y la lógica pertenecen a un proveedor: una clase que Nest crea y entrega a quien la solicita.

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

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

@Injectable() marca la clase, y el módulo la incluye en providers. Una clase la solicita nombrándola en su constructor: esto es inyección de dependencias. Nest lee el tipo del parámetro, que el compilador conserva para las clases decoradas, crea una instancia para toda la aplicación y pasa esa misma instancia a cada clase que la solicita. Los datos se comparten, y una prueba puede pasar una instancia simulada en su lugar.

Esta lección empieza con el controlador que ya llama a this.tasksService.

challenge icon

Desafío

Fácil
  • Haz que TasksService sea inyectable, dale create(title) y remove(id), el trabajo que hacía tu controlador en la lección 5, y enuméralo en providers de TasksModule.
  • Solicítalo en el constructor de TasksController.
  • Envía POST /tasks con { "title": "Buy milk" }, después GET /tasks y, después, DELETE /tasks/99.

Pruébalo tú mismo

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

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

// Convierte esta clase en un proveedor que Nest pueda inyectar.
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;
    }

    // Mueve aquí la lógica de creación y eliminación desde el controlador.
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de TypeScript y NestJS