บทความนี้จะพาคุณไปสำรวจความสามารถของ 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 เพื่อเพิ่มฟังก์ชันการทำงานต่างๆ