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.
Tantangan
MudahLangkah 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.
- Di
src/tasks/tasks.service.ts, tandai classTasksServicedengan@Injectable(), dari@nestjs/common. Ini memungkinkan Nest membuatnya dan memberikannya. - Di class yang sama, tulis method
create(title). Method ini membuat tugas dengan id kosong berikutnya (satu lebih besar daripada id terbesar dithis.tasks), judul tersebut, dandone: false. Method ini menambahkan tugas kethis.tasksdan mengembalikannya.POST /tasksmilik controller memanggilnya dengan judul dari request body. - Tulis method
remove(id), denganidberupa angka. Jika tidak ada tugas dengan id tersebut, method ini harus memberikan respons 404, sepertifindOne: panggilthis.findOne(id)terlebih dahulu, yang akan melempar error. Lalu hapus tugas darithis.tasks. Method ini tidak mengembalikan apa pun. - Di
src/tasks/tasks.module.ts, imporTasksServicedari./tasks.service, lalu tambahkan daftarproviderske module, di sampingcontrollers, dan masukkanTasksServiceke dalamnya. Nest hanya membuat class yang didaftarkan module di sana. - Di
src/tasks/tasks.controller.ts, ganti komentar di dalamTasksControllerdengan constructor yang menerima satu parameter, ditulis sebagaiprivate readonly tasksService: TasksService. Nest mengenali tipeTasksServicedan memberikan satu service-nya. Kata-kataprivate readonlydi 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.
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di TypeScript dan NestJS
Latihan sendiri: Playground Express