Custom Decorator'lara Giriş
NestJS uygulamalarında Authentication (Kimlik Doğrulama) katmanını geçtikten sonra,
controller tarafında oturum açmış kullanıcının bilgilerine erişmek sık yapılan bir
işlemdir. Genellikle bunu request nesnesi üzerinden yaparız. Ancak sürekli
@Request() req yazıp req.user çağırmak hem tip güvenliğini (type
safety) zayıflatır hem de kod tekrarına yol açar.
"Custom Param Decorator'lar sayesinde controller katmanını framework detaylarından soyutlayabilir, temiz ve test edilebilir bir kod tabanına kavuşabilirsiniz."
1. Sorun: Klasik Yaklaşım
Standart bir Guard kullanımı sonrası controller genellikle şöyle görünür:
@UseGuards(JwtAuthGuard)
@Get('profile')
getProfile(@Request() req) {
// req.user tip güvenli değildir, 'any' dönebilir.
return req.user;
}
Bu yöntem çalışır, ancak NestJS'in soyutlama gücünü kullanmaz ve Express/Fastify platformuna bağımlılık yaratır.
2. Çözüm: Custom Decorator Oluşturma
createParamDecorator fonksiyonunu kullanarak, Execution Context üzerinden request
nesnesine ulaşıp sadece ilgili veriyi (user) döndüren bir dekoratör yazalım.
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const CurrentUser = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return request.user;
},
);
3. Kullanım: Temiz ve Tip Güvenli
Artık Controller katmanında req nesnesini tamamen unutabiliriz:
@Controller('users')
export class UsersController {
@UseGuards(JwtAuthGuard)
@Get('profile')
getProfile(@CurrentUser() user: UserEntity) {
console.log(user.email);
return user;
}
}