Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Bu 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.

  1. src/tasks/tasks.service.ts içinde, @nestjs/common içinden gelen @Injectable() ile TasksService sınıfını işaretle. Bu, Nest'in onu oluşturup vermesini sağlar.
  2. Aynı sınıfta create(title) metodunu yaz. Bu metot, sıradaki boş id ile (this.tasks içindeki en büyük id'den bir fazla), belirtilen başlıkla ve done: false değeriyle bir görev oluşturur. Görevi this.tasks içine ekler ve geri döndürür. Denetleyicinin POST /tasks isteği, istek gövdesindeki başlıkla bu metodu çağırır.
  3. id değerinin bir sayı olduğu remove(id) metodunu yaz. Bu id'ye sahip görev yoksa, findOne gibi 404 yanıtı vermelidir: önce hata fırlatan this.findOne(id) metodunu çağır. Ardından görevi this.tasks içinden kaldır. Bu metot hiçbir şey döndürmez.
  4. src/tasks/tasks.module.ts içinde ./tasks.service dosyasından TasksService öğesini içe aktar; ardından modüle, controllers listesinin yanına bir providers listesi ekle ve içine TasksService öğesini koy. Nest yalnızca bir modülün burada listelediği sınıfları oluşturur.
  5. src/tasks/tasks.controller.ts içinde, TasksController içindeki yorumu, private readonly tasksService: TasksService biçiminde yazılmış tek bir parametre alan bir kurucuyla değiştir. Nest, TasksService türünü görür ve hizmetin tek örneğini aktarır. Bir parametrenin önündeki private readonly sözcükleri ayrıca, aktarılan değeri tutan this.tasksService alanı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.
}
quiz iconKendini test et

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

Kendi başına pratik yap: Express playground