การใช้ HTTP Interceptors ใน NestJS เพื่อเพิ่มประสิทธิภาพการจัดการ HTTP Requests

Oct. 26, 2024 · boychawin

บทความนี้จะพาคุณไปสำรวจความสามารถของ Interceptors และวิธีการใช้งานใน NestJS

HTTP Interceptors คืออะไร?

HTTP Interceptors เป็นฟีเจอร์ที่ช่วยให้เราสามารถปรับแต่งและจัดการกับ HTTP requests และ responses ได้อย่างยืดหยุ่น โดย Interceptors สามารถทำงานได้ในสองช่วงเวลา คือ ก่อนที่การทำงานจะเกิดขึ้น (request) และหลังจากที่การทำงานเสร็จสิ้น (response) คุณสามารถใช้ Interceptors เพื่อ

  • เพิ่มหรือเปลี่ยนแปลง headers
  • จัดการข้อผิดพลาดที่เกิดขึ้น
  • ทำ Log ข้อมูลสำหรับการตรวจสอบ
  • เปลี่ยนแปลงข้อมูล response ก่อนที่จะส่งกลับไปยังผู้ใช้

ตัวอย่างการใช้งาน HTTP Interceptors

ในตัวอย่างนี้ เราจะใช้ HttpService จาก NestJS เพื่อทำการเรียก API ของ JSONPlaceholder และเพิ่ม Interceptors เพื่อจัดการกับ request และ response


import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import {
  FastifyAdapter,
  NestFastifyApplication,
} from '@nestjs/platform-fastify';
import { HttpService } from '@nestjs/axios';
import { ClsService } from 'nestjs-cls';
import { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios';

async function bootstrap() {
  const app = await NestFactory.create<NestFastifyApplication>(
    AppModule,
    new FastifyAdapter(),
  );

  const httpService = new HttpService();
  const clsService = app.get(ClsService);

  // ตั้งค่า Interceptor สำหรับ request
  httpService.axiosRef.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
      config.timeout = Number(30000); // กำหนด timeout
      config.headers.set('request-id', 'test1'); // ตั้งค่า request-id

      // ตรวจสอบ access token และตั้งค่า Authorization header
      if (clsService.get('accessToken')) {
        config.headers.set(
          'Authorization',
          'Bearer ' + clsService.get('accessToken'),
        );
      }

      // Log ข้อมูลของ request
      console.log('Outgoing request:', {
        url: config.url,
        method: config.method,
        headers: config.headers,
        data: config.data,
        timeout: config.timeout,
      });

      return config;
    },
    (error: AxiosError) => {
      return Promise.reject(error);
    },
  );

  // ตั้งค่า Interceptor สำหรับ response
  httpService.axiosRef.interceptors.response.use(
    (response: AxiosResponse) => {
      // Log ข้อมูลของ response
      console.log('Response:', {
        url: response.config.url,
        method: response.config.method,
        status: response.status,
        data: response.data,
      });
      return response;
    },
    (error: AxiosError) => {
      return Promise.reject(error);
    },
  );

  app.setGlobalPrefix('api');
  await app.listen(4001);
}

bootstrap();

การทดสอบการเรียก API

หลังจากตั้งค่า Interceptors เรียบร้อยแล้ว คุณสามารถสร้าง controller เพื่อทำการเรียก API ได้ดังนี้

import { Controller, Get } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';

@Controller()
export class AppController {
  constructor(private readonly httpService: HttpService) {}

  @Get()
  async makeRequest() {
    const response = await this.httpService.axiosRef.get('https://jsonplaceholder.typicode.com/posts');
    return response.data;
  }
}

ผลลัพธ์

เมื่อทำการเรียก API ที่ URL คุณจะเห็นข้อมูลของ request และ response ที่ถูกล็อกใน console ดังนี้

Outgoing request: {
  url: 'https://jsonplaceholder.typicode.com/posts',
  method: 'get',
  headers: Object [AxiosHeaders] {
    Accept: 'application/json, text/plain, */*',
    'Content-Type': 'application/json',
    'request-id': 'test1'
  },
  data: undefined,
  timeout: 30000
}
Response: {
  url: 'https://jsonplaceholder.typicode.com/posts',
  method: 'get',
  status: 200,
  data: [ {...} ] // ข้อมูลที่ได้รับจาก API
}

สรุป

HTTP Interceptors ใน NestJS เป็นเครื่องมือที่ทรงพลังที่ช่วยให้เราสามารถจัดการกับ HTTP requests และ responses ได้อย่างมีประสิทธิภาพ คุณสามารถใช้ Interceptors เพื่อเพิ่มฟังก์ชันการทำงานต่างๆ