Menu
CoddyTech

Sebuah Layanan

Termasuk bagian TypeScript dan NestJS dalam perjalanan Node.js di Coddy. Pelajaran 9 dari 24.

Controller menyimpan tasks itu sendiri, jadi bagian lain dari app tidak dapat mengaksesnya. Data dan logika berada di dalam provider: sebuah class yang dibuat Nest dan diberikan kepada siapa pun yang memintanya.

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

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

@Injectable() menandai class, dan module mencantumkannya di providers. Sebuah class memintanya dengan menyebut namanya di constructor: ini disebut injeksi dependensi. private readonly di depan parameter adalah singkatan TypeScript: ini membuat field this.booksService dan menyimpan nilai yang diberikan Nest. Nest membaca tipe parameter, yang dipertahankan compiler untuk class yang diberi dekorator, membuat satu instance untuk module yang mencantumkannya, lalu memberikan instance yang sama kepada setiap class di sana yang memintanya. Data tersebut digunakan bersama, dan sebuah test dapat memberikan nilai pengganti.

Pelajaran ini dimulai dengan controller yang sudah memanggil this.tasksService.

challenge icon

Tantangan

Mudah

Langkah ini membuka proyek pelacak tugas Nest yang telah disiapkan untuk kursus ini, bukan file proyekmu dari Kode Status dan Error (termasuk src/tasks/tasks.controller.ts). Pekerjaanmu sebelumnya tetap berada di pelajarannya sendiri. Baca file yang disediakan sebelum mengedit src/tasks/tasks.service.ts. Salinan ini berisi rute tugas Nest, dengan controller yang sudah disiapkan untuk mendelegasikan tugas ke service.

Tugas berada di dalam controller, jadi bagian lain aplikasi tidak dapat mengaksesnya. Pindahkan tugas ke service: sebuah class yang memiliki tugas, yang dibuat Nest sekali lalu diberikan kepada setiap class yang memintanya. Controller sudah ditulis ulang agar memanggil service. Tugasmu adalah menyelesaikan service dan menghubungkan keduanya.

  1. Di src/tasks/tasks.service.ts, tandai class TasksService dengan @Injectable(), dari @nestjs/common. Ini memungkinkan Nest membuatnya dan memberikannya.
  2. Di class yang sama, tulis method create(title). Method ini membuat tugas dengan id kosong berikutnya (satu lebih besar daripada id terbesar di this.tasks), judul tersebut, dan done: false. Method ini menambahkan tugas ke this.tasks dan mengembalikannya. POST /tasks milik controller memanggilnya dengan judul dari request body.
  3. Tulis method remove(id), dengan id berupa angka. Jika tidak ada tugas dengan id tersebut, method ini harus memberikan respons 404, seperti findOne: panggil this.findOne(id) terlebih dahulu, yang akan melempar error. Lalu hapus tugas dari this.tasks. Method ini tidak mengembalikan apa pun.
  4. Di src/tasks/tasks.module.ts, impor TasksService dari ./tasks.service, lalu tambahkan daftar providers ke module, di samping controllers, dan masukkan TasksService ke dalamnya. Nest hanya membuat class yang didaftarkan module di sana.
  5. Di src/tasks/tasks.controller.ts, ganti komentar di dalam TasksController dengan constructor yang menerima satu parameter, ditulis sebagai private readonly tasksService: TasksService. Nest mengenali tipe TasksService dan memberikan satu service-nya. Kata-kata private readonly di depan parameter juga membuat field, this.tasksService, yang menyimpan nilai yang diberikan. Itulah nama yang sudah digunakan oleh method di bawah.

Coba: kirim POST { "title": "Buy milk" } ke /tasks. Kamu mendapatkan 201 dan:

{ "id": 4, "title": "Buy milk", "done": false }

Kirim GET /tasks: empat tugas, dengan Buy milk di urutan terakhir. Kirim DELETE /tasks/4: 204. Kirim DELETE /tasks/99: 404 dengan "message": "Task 99 not found".

Coba sendiri

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

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

// Jadikan class ini provider yang dapat di-inject oleh Nest.
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;
    }

    // Tulis create(title) dan remove(id) di sini.
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di TypeScript dan NestJS

Latihan sendiri: Playground Express