NestJS ile Middleware Kullanımı: Loglama ve Doğrulama Örnekleriyle
NestJS serimize devam ederek bir adım daha ileriye gidiyoruz. Bir önceki yazımızda NestJS Nedir? ile giriş yapmıştık. Şimdi ise Middleware ve Guardsları inceleyeceğiz.
NestJS Middleware Nedir?
Aslında bunu NestJS middleware nedir diye sorarsak sadece NestJS’e özgü gibi bir izlenim verebilir ama Middleware sadece NestJS’e özgü değildir. Middleware konsepti genel olarak web uygulama geliştirme ve backend framework’lerinde kullanılan yaygın bir tasarım yaklaşımıdır. Birçok framework, isteklerin (HTTP request) işlenme sırasını kontrol etmek ve çeşitli işlemleri (örneğin, kimlik doğrulama, loglama, hata yakalama) gerçekleştirmek için middleware yapısını kullanır.
Middleware Nerelerde Kullanılır?
Middleware’ler request-response döngüsünde ara katman olarak çalışır. Middleware, request uygulamaya gelmeden önce veya response kullanıcıya dönülmeden önce belirli işlemlerden geçmesini sağlar. Çoğu modern framework ve teknoloji, middleware konseptini kullanır.
- Gelen istekleri manipüle edebilir.
- İstek verilerini loglayabilir.
- Kimlik doğrulama işlemleri yapabilir.
- İsteklerin yönlendirilmesini kontrol edebilir.
Middleware’in Çalışma Sırası
- Bir HTTP isteği gelir.
- Middleware’ler sırayla çalışır.
- Eğer istek kabul edilirse route’a (controller’a) yönlendirilir.
- Yanıt, istemciye dönmeden önce tekrar middleware zincirinden geçebilir.
NestJS’te Middleware
NestJS’de middleware uygulamak için express.js veya fastify kullanılır. NestJS’te bir middleware, genelde @Injectable dekoratörü ile tanımlanır ve NestMiddleware arayüzünü implement eder.
Daha iyi anlayabilmemiz açısından örnekler ile devam edelim. Öncelikle bir middleware oluşturalım bunu NestJS CLI ile yapacağız.
nest g middleware cozumparkAuth // Middleware adı
Bu kod bize böyle bir dosya oluşturacaktır:
src > cozumpark-auth > cozumpark-auth.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
@Injectable()
export class CozumparkAuthMiddleware implements NestMiddleware {
use(req: any, res: any, next: () => void) {
next();
}
}
Middleware Kullanım Alanları ve Örnekler
1. İstek Loglama
Middleware, gelen her isteği loglamak için kullanılabilir. Logger adında bir middleware oluşturuyorum.
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log(`Method: ${req.method}, URL: ${req.url}`);
next();
}
}
Middleware kullanabilmemiz için AppModule dosyamıza eklememiz gerekir.
import { Module, MiddlewareConsumer, RequestMethod } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { RequestLoggerMiddleware } from './logger/logger.middleware';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(RequestLoggerMiddleware)
.forRoutes({ path: '*', method: RequestMethod.ALL }); // Tüm rotalar için geçerli
}
}
Görüldüğü üzere uygulamamıza gelen tüm istekleri bu şekilde loglayabiliyoruz.