วัน: 6 มีนาคม 2012

การใช้งาน Axios Instance: การตั้งค่า BaseURL, Headers และ Timeout ล่วงหน้าเพื่อลดโค้ดซ้ำซ้อนการใช้งาน Axios Instance: การตั้งค่า BaseURL, Headers และ Timeout ล่วงหน้าเพื่อลดโค้ดซ้ำซ้อน

ในโลกของการพัฒนาแอปพลิเคชันสมัยใหม่ การสื่อสารระหว่าง Frontend และ Backend ผ่าน API เป็นหัวใจสำคัญที่กำหนดประสบการณ์ของผู้ใช้งานทั้งหมด เมื่อโปรเจกต์เริ่มขยายขนาดและมีการเรียกใช้ Endpoint ต่างๆ จำนวนมาก นักพัฒนามักจะพบกับปัญหาโค้ดซ้ำซ้อน (Boilerplate Code) ในการตั้งค่าพื้นฐาน เช่น การระบุ URL หลัก, การแนบ Token สำหรับ Authentication หรือแม้แต่การกำหนดระยะเวลาในการรอการตอบกลับ ซึ่งหากจัดการด้วยวิธีเดิมๆ จะทำให้โค้ดดูยุ่งเหยิงและยากต่อการบำรุงรักษา


เจาะลึกรายละเอียดและประเด็นสำคัญ

การใช้ Axios Instance คือแนวทางปฏิบัติที่ดีที่สุด (Best Practice) ในการแก้ปัญหาดังกล่าว โดยหลักการคือการสร้าง “ตัวแทน” การเรียก API ที่ถูกตั้งค่าพารามิเตอร์พื้นฐานทั้งหมดไว้ล่วงหน้า ไม่ว่าจะเป็น BaseURL ของ Backend, Headers มาตรฐาน เช่น Content-Type หรือ Authorization Token และการกำหนดค่า Timeout ทั่วไป เมื่อเรามี Instance นี้แล้ว ทุกๆ การเรียกใช้ API ในส่วนอื่นของแอปพลิเคชันก็จะสามารถเรียกผ่าน Instance นี้ได้ทันที ทำให้โค้ดของเราสะอาดขึ้นและลดความเสี่ยงจากการลืมตั้งค่าพื้นฐานในบางจุด

นอกจากนี้ การกำหนด Timeout ล่วงหน้ายังเป็นสิ่งสำคัญอย่างยิ่งในการสร้างแอปพลิเคชันที่แข็งแกร่ง (Robust) เพราะมันช่วยป้องกันไม่ให้ผู้ใช้งานต้องรอการตอบกลับจาก API ที่ล้มเหลวหรือติดขัดนานเกินไป ซึ่งจะส่งผลเสียต่อประสบการณ์โดยรวมของระบบ การจัดการค่าเหล่านี้ในระดับ Instance ทำให้เราสามารถควบคุมพฤติกรรมของการเรียก API ทั้งหมดได้อย่างเป็นศูนย์กลาง (Centralized Control)

import axios from 'axios';

// 1. สร้าง Instance ที่มีการตั้งค่าพื้นฐานทั้งหมด
const api = axios.create({
  baseURL: 'https://api.yourdomain.com/v1', // Base URL หลักของ API
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${localStorage.getItem('token')}` // ตั้งค่า Token ล่วงหน้า
  },
  timeout: 10000 // กำหนด Timeout เป็น 10 วินาที (10000 ms)
});

// 2. การจัดการ Interceptors สำหรับการ Refresh Token หรือ Error ทั่วไป
api.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.response && error.response.status === 401) {
      console.error("Unauthorized: Token หมดอายุ กรุณาเข้าสู่ระบบใหม่");
      // Logic สำหรับการ Redirect ไปหน้า Login
    }
    return Promise.reject(error);
  }
);

// 3. การเรียกใช้ API โดยไม่ต้องระบุ BaseURL หรือ Headers ซ้ำซ้อน
const fetchUserData = async (userId) => {
  try {
    const response = await api.get(`/users/${userId}/profile`); // ระบบจะเติม baseURL ให้โดยอัตโนมัติ
    return response.data;
  } catch (error) {
    console.error("Failed to fetch data:", error);
  }
};

การนำไปประยุกต์ใช้ในชีวิตและการทำงานยุคใหม่

  • การเพิ่มความสามารถในการบำรุงรักษา (Maintainability): เมื่อ API Endpoint มีการเปลี่ยนแปลง เช่น การเปลี่ยน BaseURL หรือรูปแบบของ Header ที่ต้องใช้ Token ใหม่ นักพัฒนาเพียงแค่แก้ไขโค้ดในไฟล์ Instance เดียวเท่านั้น ไม่จำเป็นต้องไล่แก้ทุกจุดที่เรียกใช้ API ทั่วทั้งโปรเจกต์ ซึ่งช่วยลดโอกาสเกิด Human Error ได้อย่างมาก
  • การสร้างระบบนิเวศของโค้ด (Code Ecosystem): การใช้ Instance ทำให้เราสามารถผูก Logic สำคัญอื่นๆ เข้าไปได้ เช่น การเพิ่ม Interceptors เพื่อจัดการ Token หมดอายุอัตโนมัติ หรือการ Log ทุก Request/Response โดยไม่ต้องเขียนโค้ดเหล่านั้นซ้ำในทุกฟังก์ชันที่เรียก API

โดยสรุปแล้ว การทำ Axios Instance ไม่ใช่แค่การลดจำนวนบรรทัดของโค้ดเท่านั้น แต่เป็นการยกระดับสถาปัตยกรรมของแอปพลิเคชันให้มีความเป็นระเบียบ มีมาตรฐาน และพร้อมสำหรับการขยายตัวในอนาคต ทำให้ทีมพัฒนาสามารถโฟกัสไปที่ Business Logic หลักได้อย่างเต็มที่ โดยไม่ต้องกังวลกับรายละเอียดปลีกย่อยของการเชื่อมต่อเครือข่ายอีกต่อไป


อ่านเพิ่มเติม