Bir Servis
Coddy'nin Node.js Journey'sinin TypeScript ve NestJS bölümünün bir parçası. Ders 9 / 24.
Denetleyici görevleri kendi içinde tutar, bu yüzden uygulamanın başka hiçbir bölümü bu görevlere erişemez. Veriler ve mantık bir sağlayıcıya aittir: Nest’in oluşturduğu ve isteyenlere verdiği bir sınıfa.
@Injectable()
export class BooksService {
private books = [{ title: 'Dune' }];
}
@Controller('books')
export class BooksController {
constructor(private readonly booksService: BooksService) {}
}@Injectable() sınıfı işaretler ve modül onu providers listesine ekler. Bir sınıf, kurucusunda adını belirterek onu ister: buna bağımlılık enjeksiyonu denir. Parametrenin önündeki private readonly, TypeScript’in kısa yazımıdır: this.booksService alanını oluşturur ve Nest’in verdiği değeri burada saklar. Nest, derleyicinin dekore edilmiş sınıflar için koruduğu parametre türünü okur, bu sağlayıcıyı listeleyen modül için tek bir örnek oluşturur ve bu örneği isteyen oradaki her sınıfa aynı örneği verir. Veriler paylaşılır ve bir test bunun yerine sahte bir örnek verebilir.
Bu ders, denetleyicinin zaten this.tasksService çağrısını yaptığı noktadan başlar.
Görev
KolayBu adım, Status Codes and Errors dersindeki proje dosyaların yerine, kurs için hazırlanmış Nest görev takipçisi projesini açar (buna src/tasks/tasks.controller.ts de dahildir). Önceki çalışmaların kendi dersinde kalır. src/tasks/tasks.service.ts dosyasını düzenlemeden önce sağlanan dosyaları oku. Bu kopyada Nest görev rotaları bulunur ve denetleyici, bir hizmete devredecek şekilde hazırlanmıştır.
Görevler denetleyicinin içinde bulunur, dolayısıyla uygulamanın başka hiçbir bölümü onlara erişemez. Onları bir hizmete taşı: görevlerin sahibi olan, Nest'in bir kez oluşturup isteyen her sınıfa verdiği bir sınıf. Denetleyici, hizmeti çağıracak şekilde zaten yeniden yazılmıştır. Senin görevin hizmeti tamamlamak ve ikisini birbirine bağlamaktır.
src/tasks/tasks.service.tsiçinde,@nestjs/commoniçinden gelen@Injectable()ileTasksServicesınıfını işaretle. Bu, Nest'in onu oluşturup vermesini sağlar.- Aynı sınıfta
create(title)metodunu yaz. Bu metot, sıradaki boş id ile (this.tasksiçindeki en büyük id'den bir fazla), belirtilen başlıkla vedone: falsedeğeriyle bir görev oluşturur. Görevithis.tasksiçine ekler ve geri döndürür. DenetleyicininPOST /tasksisteği, istek gövdesindeki başlıkla bu metodu çağırır. iddeğerinin bir sayı olduğuremove(id)metodunu yaz. Bu id'ye sahip görev yoksa,findOnegibi 404 yanıtı vermelidir: önce hata fırlatanthis.findOne(id)metodunu çağır. Ardından görevithis.tasksiçinden kaldır. Bu metot hiçbir şey döndürmez.src/tasks/tasks.module.tsiçinde./tasks.servicedosyasındanTasksServiceöğesini içe aktar; ardından modüle,controllerslistesinin yanına birproviderslistesi ekle ve içineTasksServiceöğesini koy. Nest yalnızca bir modülün burada listelediği sınıfları oluşturur.src/tasks/tasks.controller.tsiçinde,TasksControlleriçindeki yorumu,private readonly tasksService: TasksServicebiçiminde yazılmış tek bir parametre alan bir kurucuyla değiştir. Nest,TasksServicetürünü görür ve hizmetin tek örneğini aktarır. Bir parametrenin önündekiprivate readonlysözcükleri ayrıca, aktarılan değeri tutanthis.tasksServicealanını oluşturur. Aşağıdaki metotların zaten kullandığı ad budur.
Deneyin: /tasks adresine POST isteğiyle { "title": "Buy milk" } gönderin. 201 yanıtı ve şu sonucu alırsınız:
{ "id": 4, "title": "Buy milk", "done": false }GET /tasks gönderin: son sırada Buy milk olacak şekilde dört görev. DELETE /tasks/4 gönderin: 204. DELETE /tasks/99 gönderin: "message": "Task 99 not found" mesajıyla 404.
Kendin dene
import { NotFoundException } from '@nestjs/common';
export interface Task {
id: number;
title: string;
done: boolean;
createdAt?: string;
}
// Bu sınıfı Nest'in enjekte edebileceği bir provider yapın.
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;
}
// create(title) ve remove(id) işlevlerini buraya yazın.
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
TypeScript ve NestJS bölümündeki tüm dersler
1Nest Temelleri
Sınıflar ve MetotlarMerhaba, NestBir Controller Kaydetme4Guard’lar, Filtreler, Interceptor’lar
Guard’larKendi başına pratik yap: Express playground