· Özgür Vurgun · NestJS · 2 min read
8. 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.bodyyerine@Body()kullanırsın.res.send()yerine doğrudanreturnyaparsı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.
@Get()
handleResponse(@Res() res: Response) {
res.status(200).json({ message: 'Manuel yanıt' });
}Bu yaklaşım seni Express’e bağımlı hâle getirir. NestJS bunu pek önermiyor. Nedenine birazdan geleceğiz.
NestJS’in Tavsiye Ettiği Yol
Controller metodlarında mümkünse @Res() kullanmak yerine doğrudan return et.
@Get()
getAll() {
return { message: 'Otomatik cevap!' };
}Nest, bu cevabı otomatik olarak JSON’a çevirir ve status code verir (200 OK).
Yani
@Res()yerinereturn-> Nest-nativeres.send()-> Express-native
Ne Zaman @Res() Kullanılır?
Bazı özel durumlarda @Res() kullanmak mantıklıdır: Durum@Res() Kullanımı Gerekli mi?Dosya indirme (res.download())GerekliResponse stream açmaGerekliÖzel header veya cookie yazmaGerekli (ama @Res() zorunlu değil)Redirection (res.redirect())GerekliNormal JSON cevabı dönmekreturn kullan yeter
Kafa Karışıklığı: @Res() Kullanırsan Return Çalışmaz
Eğer @Res() kullanırsan, Nest artık otomatik olarak response dönmez. Sen dönmezsen cevap timeout olur.
@Get()
manual(@Res() res: Response) {
// return yazsan da çalışmaz
res.status(201).send('Tamamdır');
}Bu yüzden
@Res()kullandığında her zaman cevabı sen vermelisin.
@Body(), @Param(), @Query() ile Farkı Ne?
DekoratörAçıklama@Body()Request body (POST içerikleri)@Param()URL path parametresi (/user/:id)@Query()Query string (?page=2)@Headers()İstek başlıkları (req.headers)@Req()Tüm request objesi (Express tipinde)@Res()Response objesi (manuel kontrol)
Yani
@Req()ve@Res()-> ham kontrol Diğerleri (@Body,@Param) -> değiştirilebilir parça
Analoji
@Req() ve @Res() kullanmak = manuel vites araba @Body(), @Param(), return kullanmak = otomatik vites
Her ikisi de seni bir yere götürür ama biri daha zahmetsiz ve güvenlidir.
Objektif Gerçekler
@Res()performanslıdır ama Nest felsefesine aykırıdır.- Test yazmak zorlaşır (çünkü response manuel kontrol ister)
returnise daha sade, test edilebilir, okunaklıdır.@Res()ile çalışınca response akışını kaçırma ihtimalin artar (özellikle async fonksiyonlarda)
Özet
@Req()ve@Res()ile istek/cevaba direkt erişebilirsin- Ama NestJS
returntemelli response yönetimini tercih eder @Body(),@Param(),@Query()gibi dekoratörlerle daha sade yazılır@Res()kullanıyorsan, cevabı sen döndürmek zorundasın- Özel durumlar dışında Nest-native kalmak uzun vadede daha sağlıklıdır



