Menu
CoddyTech

Interseptor

Termasuk bagian TypeScript dan NestJS dalam perjalanan Node.js di Coddy. Pelajaran 16 dari 17.

Kamu ingin setiap jawaban menyebutkan berapa lama waktu yang dibutuhkan, tanpa mengubah setiap handler. interceptor membungkus handler: kode sebelum next.handle() berjalan sebelumnya, dan kode pada nilai yang dikembalikan next.handle() berjalan sesudahnya.

intercept(context: ExecutionContext, next: CallHandler) {
    console.log('before');
    return next.handle().pipe(
        tap(() => console.log('after')),
    );
}

next.handle() memberikan hasil handler sebagai observable RxJS, yaitu nilai yang tiba kemudian. pipe(tap(...)) menjalankan fungsi saat nilai itu tiba, sebelum Nest mengirimkannya. Kembalikan observable yang telah di-pipe: Nest mengirimkan nilai yang dibawanya. context.switchToHttp().getResponse() memberikan res, yang setHeader-nya menambahkan header.

app.useGlobalInterceptors(...) menerapkan interceptor ke setiap route; @UseInterceptors(...) menerapkannya ke satu controller.

challenge icon

Tantangan

Mudah
  • Selesaikan ResponseTimeInterceptor: setiap respons menyertakan X-Response-Time, yaitu waktu dalam milidetik yang dibutuhkan handler, seperti 3ms.
  • Daftarkan untuk seluruh aplikasi.
  • Kirim GET /tasks dan GET /stats, lalu buka tab Headers. Setelah itu, kirim POST /tasks tanpa kunci.

Coba sendiri

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> {
        // Catat waktunya, biarkan handler berjalan, lalu atur X-Response-Time.
        return next.handle();
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di TypeScript dan NestJS

Latihan sendiri: Playground Express