Interceptor'lar
Coddy'nin Node.js Journey'sinin TypeScript ve NestJS bölümünün bir parçası. Ders 16 / 17.
Her yanıtın, her işleyiciye dokunmadan ne kadar sürdüğünü söylemesini istiyorsun. Bir araya girici, işleyiciyi sarar: next.handle() öncesindeki kod ondan önce çalışır, next.handle() çağrısının döndürdüğü değer üzerindeki kod ise ondan sonra çalışır.
intercept(context: ExecutionContext, next: CallHandler) {
console.log('before');
return next.handle().pipe(
tap(() => console.log('after')),
);
}next.handle(), işleyicinin sonucunu RxJS gözlemlenebilir değeri olarak verir; bu, daha sonra gelen bir değerdir. pipe(tap(...)), değer geldiğinde Nest onu göndermeden önce bir işlev çalıştırır. Boru hattına alınmış gözlemlenebilir değeri döndür: Nest onun taşıdığı değeri gönderir. context.switchToHttp().getResponse(), res değerini verir; bu değerin setHeader yöntemi bir başlık ekler.
app.useGlobalInterceptors(...) bir araya giriciyi her rotaya uygular; @UseInterceptors(...) ise tek bir denetleyiciye uygular.
Görev
KolayResponseTimeInterceptor'ı tamamla: her yanıt, işleyicinin ne kadar sürdüğünü milisaniye cinsinden gösterenX-Response-Timebaşlığını, örneğin3msdeğerini içerir.- Bunu tüm uygulama için kaydet.
GET /tasksveGET /statsisteklerini gönderip Headers sekmesini aç, ardından anahtar olmadanPOST /tasksisteğini gönder.
Kendin dene
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable, tap } from 'rxjs';
@Injectable()
export class ResponseTimeInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {
// Zamanı kaydedin, handler'ın çalışmasına izin verin, ardından X-Response-Time değerini ayarlayın.
return next.handle();
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.