Giriş Temel Bİlgiler
NestJS’e Giriş: Neden Yeni Bir Şeye Daha İhtiyacımız Var? Node.js harika. JavaScript’in gücünü sunucu tarafına taşıdı, “Aynı dili hem frontend’de hem backend’de kullanma” rüyasını gerçeğe dönüştürdü. Ama ne zaman ki işler büyüdü, bu özgürlük başımıza bela olmaya başladı. Çünkü:
Herkes her şeyi her yerde yapabiliyordu. Proje büyüdükçe dosyalar çöplüğe dönebiliyordu. Kod tekrarları, karışık business logic, zor test edilebilir yapılar ortaya çıkıyordu. İşte NestJS burada sahneye çıkıyor.
NestJS Nedir? NestJS, TypeScript ile yazılmış, modüler bir backend framework’üdür.…
Read more ⟶İlk NestJS Uygulaması
NestJS Projesine İlk Adım Artık teoriyi kenara bırakıp işe girişme zamanı. Bu yazıda, sıfırdan bir NestJS projesi oluşturup çalıştıracağız. “Hello World” endpoint’imizi yazacak, klasörleri tanıyacak, ve uygulamanın yaşam döngüsünü anlayacağız.
Amaç: NestJS’e dair temel taşları yerine oturtmak. Ezberlemeden, sindirerek ilerlemek.
1. NestJS CLI ile Proje Oluşturma NestJS, Angular’dan esinlenmiş bir yapı sunduğu için, benzer şekilde bir CLI (Command Line Interface) aracı sunar.
Kurulum:
npm i -g @nestjs/cli Yeni proje oluştur:…
Read more ⟶NestJS Mimarisi: Modüller ve Temel Kavramlar (1. Bölüm)
Neden Modül? Küçük projelerde her şeyi tek dosyada yazmak kolaydır. Ama işler büyüyünce işler sarpa sarar. Kod karmaşıklaşır, neyin nerede olduğunu bulmak zorlaşır. İşte burada modüller devreye girer.
NestJS, Angular’dan aldığı ilhamla “her şey bir modülün içinde” prensibiyle çalışır.
Bir modül, belirli bir işlevi yerine getiren yapıları gruplar: controller’lar, service’ler, provider’lar…
1. Modül Nedir? NestJS’te her yapı bir modülün içinde yaşar.
Modül; bağımsız, izole, bir iş parçasını temsil eden bir yapıdır.…
Read more ⟶NestJS Mimarisi: Modüller Arası İletişim (2. Bölüm)
Modüller Arası İletişim Neden Önemlidir? Modülleri ayırdık ama gerçek hayatta işler böyle izole ilerlemez.
Örneğin:
Kullanıcı kaydı yapılınca log’a bir şey yazmak isteyebilirsin. Bir ödeme alınınca stok sistemini bilgilendirmek isteyebilirsin. Yani modüllerin birbiriyle konuşması gerekir.
NestJS bunu imports, exports ve dependency injection sistemleriyle sağlar.
Temel Kurgu: Service Kullanmak Senaryomuz şu:
UserService adında bir servisimiz var (UserModule içinde) AuthModule bu servisi kullanmak istiyor (örneğin kullanıcıyı veritabanında sorgulamak için) Şöyle bir şey yapmak istiyoruz:…
Read more ⟶NestJS Mimarisi: Dinamik Modüller ve Yapılandırma (3. Bölüm)
Dinamik Modül Nedir? Normal modüller sabittir. İçine neyi yazdıysan, sistem onu kullanır.
Ama bazen bir modülün kurulum aşamasında parametre alması gerekir.
Yani modülün davranışı dışarıdan gelen bir yapılandırmaya göre değişmelidir.
İşte burada dinamik modül devreye girer.
Gerçek Hayat Senaryosu Diyelim ki bir MailerModule yazıyorsun.
Geliştirme ortamında log’a yazmasını, Gerçek ortamda ise SMTP sunucusuna mail atmasını istiyorsun. Yani modül şunu demeli:
“Ben dışarıdan bana nasıl davranacağım söylensin istiyorum.”
Nasıl Tanımlanır? Dinamik modül, static register() veya static registerAsync() metotlarıyla tanımlanır.…
Read more ⟶NestJS Mimarisi: Global Modüller ve Kullanım Senaryoları (4. Bölüm)
Global Modül Nedir? NestJS’te bir modül normalde sadece import edildiği yerde kullanılır.
Yani UserModule içinde tanımlı bir UserService, sadece onu import eden modüller tarafından erişilebilir.
Ama bazı modüller vardır ki:
“Beni her yerden erişilebilir yap” demek ister.
İşte bu tür modüller için global modül kavramı vardır.
Nasıl Tanımlanır? Bir modülü global yapmak için @Global() dekoratörünü kullanırız.
// logger.module.ts @Global() @Module({ providers: [LoggerService], exports: [LoggerService], }) export class LoggerModule {} Artık bu modülü AppModule‘de bir kez import etmek yeterlidir:…
Read more ⟶NestJS Mimarisi: Controller Nedir? Ne Değildir? (5. Bölüm)
Controller Nedir? NestJS’te Controller, gelen HTTP isteklerini karşılayan yapıdır.
Yani dış dünyadan gelen tüm GET, POST, PUT, DELETE istekleri burada karşılanır.
Kısaca: Controller = API’nin giriş noktasıdır.
Router mı bu? Express kullanmış olanlar için şöyle bir benzetme yapalım:
// Express app.get('/users', handler); // NestJS @Controller('users') export class UserController { @Get() getAll() { return 'user listesi'; } } Arka planda aslında Express (veya Fastify) hala çalışıyor. Ama NestJS bunu sınıflar ve dekoratörlerle daha okunabilir ve organize bir hâle getiriyor.…
Read more ⟶NestJS Mimarisi: Controller’da Request ve Response Nesnelerinin Kullanımı (6. Bölüm)
NestJS’te Request ve Response Nesneleri NestJS, altında Express (veya Fastify) kullanır.
Yani istersen alışılagelmiş req, res nesnelerine erişebilirsin.
Ama NestJS bunun yerine decorator temelli bir yaklaşım sunar.
Yani doğrudan req.body yerine @Body() kullanırsın.
res.send() yerine doğrudan return yaparsın.
Peki nasıl ve neden?
@Req() ve @Res() Nedir? @Req(): HTTP isteğini temsil eden Request objesini verir. (Express tipindedir)
@Get() handleRequest(@Req() req: Request) { console.log(req.headers['user-agent']); return 'Gelen istek işlendi'; } @Res(): Manuel olarak yanıt oluşturmak istediğinde kullanılır.…
Read more ⟶NestJS Mimarisi: Status Code Yönetimi (7. Bölüm)
HTTP Status Code Nedir? Neden Önemlidir? Bir API sadece veri döndürmez.
Her cevabın bir anlamı olmalıdır. Bu anlamı taşıyan şey de status code’tur.
return { message: 'Başarılı!' }; Bu cevap 200 OK ile gelir mi? 201 Created mi? Yoksa 400 Bad Request mi? İşte bu çok kritik. Çünkü:
Status code = İstemciye ne olduğunu anlatan işaret lambasıdır.
NestJS’te Status Code Nasıl Yönetilir? En sade yol: @HttpCode() dekoratörüdür.
@Post() @HttpCode(201) createUser() { return { message: 'Kullanıcı oluşturuldu' }; } Bu örnekte POST /users isteğine dönüş 201 Created olacaktır.…
Read more ⟶NestJS Mimarisi: Global Exception Handle (8. Bölüm)
Hata Fırlatmak Yetmez, Yakalamak da Gerekir Hatalar kaçınılmaz. Ama kontrolsüz hata = üretimde patlayan sistem = sinirli müşteri = uykusuz geliştirici.
NestJS bu durumu çözmek için merkezî bir hata yakalama mekanizması sunar: Global Exception Filter
Şimdiye Kadar Ne Yaptık? Şöyle kodlar yazdık:
if (!userExists(id)) { throw new NotFoundException('Kullanıcı bulunamadı'); } Ve Nest bunu alıp güzelce 404 yanıtıyla döndü. Harika.
Ama ya özel bir hata sınıfı yazmak istiyorsan? Ya da her hatayı { status, errorCode, message, timestamp } gibi özel bir formatta döndürmek istiyorsan?…
Read more ⟶