NestJS Nedir? NestJS, Node.js üzerine inşa edilmiş, modern ve ölçeklenebilir uygulamalar geliştirmek için kullanılan açık kaynaklı bir framework‘tür. TypeScript ile yazılmıştır ve JavaScript destekler. NestJS, backend geliştirme sürecini hızlandırmak ve daha verimli hale getirmek için modüler bir mimari, güçlü dependency injection (bağımlılık enjeksiyonu) ve declarative (bildirime dayalı) bir yapı sunar.
NestJS temelde Controller, Service ve Modules üzerine kurulu bir yapıya sahiptir. Bu üç bileşen, NestJS’in modüler, ölçeklenebilir ve bakımı kolay yapısının temel taşlarını oluşturur. Bu üç yapıyı detaylandıralım:
1-) Controller
- Uygulamaların gelen HTTP isteklerini karşılar (GET,POST,PUT,DELETE) ve uygun yanıtı döndürür.
- Controller’lar, uygulamalarınızın dış dünya ile iletişimde olan bir bileşen gibi düşünülebilir. Veri işlemlerini ilgili Servislere yönlendirerek cevapları döndürür.
- Dekoratörler kullanılarak Controller HTTP istekleri yönlendirilebilir. (
@Get()
,@Post()
,@Put()
,@Delete()
.
Örnek Controller Dosyası:
import { Controller, Get } from "@nestjs/common";
@Controller('cozumpark')
export class CozumParkController {
@Get('posts')
findAll(){
return 'hello world!'
}
}
Controller dosyasında bulunan Dekoratörler‘e biraz daha yakından bakalım.
- @Controller(‘cozumpark’) => Controller dekoratörü ile uygulamamızın buraya gelen istekleri için bir prefix verebiliriz. Gelen tüm isteklerin başına otomatik olarak /cozumpark/users , /cozumpark/posts şeklinde kendisi ekleyecektir. Bu alan boş kaldığında sadece controller içerisinde kullanılan endpointlere erişilebilir. Örneğin, @Get(‘posts’) olarak eklemiş olduğumuz endpointe istek sadece /posts şeklinde atılabilir.
- @Get() => Get dekoratörü ile endpointimizin HTTP methodunu belirtiyoruz. @Post() veya @Delete(), @Put() alabilmektedir. Endpoint yolumuzu içerisine giriyoruz.
- export class CozumParkController => Controller’a isim belirtirken dilediğiniz ismi verebilirsiniz fakat proje büyüdükçe daha rahat bir şekilde anlaşılması açısından isimden sonra Controller eklenmesi projenizin yönetilebilirliğini kolaylaştırır.
1-) Service
- Service‘ler çoğunlukla Controller‘lardan gelen verileri alarak, gerekli işlemleri gerçekleştirir (veritabanı sorguları, diğer servisler ile bağlılık vs…).
Örnek Service Dosyası:
import { Injectable } from "@nestjs/common";
@Injectable()
export class CozumParkService {
async findAll(){
return 'hello world!'
}
}
Yukarıda bir controller dosyamız bulunuyordu. Birde servis dosyamız olduğuna göre şimdi controller ile servis dosyamızı bağlayarak gelen isteği servise yönlendirecek şekilde yapılandırabiliriz. Öncelikle controller dosyamıza ilgili servis dosyamızı dahil etmemiz gerekmektedir. Bunu constructor ile yapacağız.
Controller ile Servis bağımlılığı:
Burada constructor ile beraber ilgili servisimizi controller’a dahil ettik ve “/” endpointine gelen isteklerimizi cozumparkService iletmiş olduk. constructor’a servis dahil ederken ilk yazdığımız takma adımız oluyor ikinci yazdığımız için ona karşılık gelecek servis adımız oluyor. Takma adı kısmına yine dilediğinizi verebilirsiniz fakat projenizi yönetebilmeniz açısından sonuna Service eklemeniz sizler için daha sağlıklı olacaktır.
import { Controller, Get } from "@nestjs/common";
@Controller('cozumpark')
export class CozumParkController {
constructor(cozumparkService: CozumParkService){}
@Get()
findAll(){
return this.cozumparkService.findAll()
}
}
1-) Modules
- Module, NestJS’in olmazsa olmazlarından, en temel yapı taşlarından biridir. NestJS projelerinde uygulama, genellikle birden fazla modüle (feature) ayrılır ve her modül kendi içinde bağımsız olarak çalışabilir. Her modül, ilgili controller ve service’leri içerir. NestJS’in temelde sağlamış olduğu kolaylık ise burada ortaya çıkıyor.
Örnek Module Dosyası:
import { Module } from "@nestjs/common";
import { CozumParkController } from './cozumpark.controller';
import { CozumParkService } from './cozumpark.service';
@Module({
imports:[],
controllers:[CozumParkController],
providers:[CozumParkService],
exports:[]
})
export class CozumParkModule{}
Module dosyamızda 4 alan bulunmaktadır. imports, controllers, providers, exports. Tek tek bunları detaylandıralım:
İmports: Farklı bir modulü veya servisi dahil etmemizi sağlar.
controllers: Sadece kendi controller dosyasını dahil edilmesini ve tanımasını sağlar.
providers: Controller gibi, sadece kendi servisinin dahil edilmesini ve tanınmasını sağlar.
exports: Diğer servis ve modüller tarafından kullanılmasını istediğimiz servisimi ekleyebiliriz. Bu alana servis eklemediğimizde diğer modüller ve servisler burada bulunan servislere erişemezler.
Temel Yapı ve Akış
- Controller gelen HTTP isteklerini alır, uygun Service‘i çağırır ve geri döner.
- Service iş mantığını ve veri işlemlerini yönetir.
- Module tüm bileşenleri (Controller ve Service) bir araya getirir ve bağımlılıkları yönetir.
Bu üç temel bileşen sayesinde NestJS, hem modüler hem de bakımı kolay bir yapı sunar. Controller‘lar dışarıyla iletişim kurarken, Service‘ler iş mantığını içerir ve Modules‘lar projeyi organize eder. Bu yapı, uygulamanın büyüdükçe daha yönetilebilir ve sürdürülebilir olmasını sağlar.
Modül dosyasının diğer modüller tarafından tanınabilmesi için ve isteklerin işlenebilmesi için ana modül olan AppModule eklenmesi gerekir.
Tüm bu controller,service, modules gibi bileşenlerin elle manuel şekilde oluşturulabildiği gibi NestJS CLI ile oluşturulabilir.
CLI ile controller oluşturulması:
nest g controller CozumPark
CLI ile module oluşturulması:
nest generate module CozumPark
CLI ile service oluşturulması:
nest generate service CozumPark
Toplu oluşturulması
nest g resource users
NestJS’in temel yapı taşlarını bu şekilde görmüş olduk. Şimdi bir proje oluşturalım ve çalıştırma aşamasına geçelim.
Proje Oluşturma
NestJS projesi oluşturmak için öncelikle bazı temel araçları ve bağımlılıkları yüklememiz gerekir. Bunları global olarak yükleyebiliriz.
Öncelikle node ve npm kurulu olduğunu doğrulayalım:
node -v
npm -v
Node ve npm’in kurulu olduğunu doğruladıktan sonra NestJS’i global olarak kurabiliriz.
npm i -g @nestjs/cli
Kurduktan sonra nest new [name] şeklinde projemizi kurabiliriz.
Projemizi bu şekilde kurduktan sonra gerekli paketlerin indirilmesi gerekir.
ana dizinde yarn install veya npm install ile projemiz için gerekli paketleri indiriyoruz. Projemi çalıştırmak için yarn start:dev komutunu çalıştırmamız yeterli.
Projemiz 3000. port üzerinden çalışmaya başladı.
Yukarıda anlattığımız controller ve servisi daha iyi anlayabilmemiz açısından bir controller ve servis oluşturarak test gerçekleştirelim.
Controller dosyamız, service dosyamız, module dosyamız ve en sonda ise ana modülümüz olan app module dosyasına dahil olan CozumPark modulumuz bulunuyor.