Node.js Axios:更強大的 HTTP 請求工具

雖然現代 Node.js 已內建了全域的 fetch API,但在許多中大型專案中,Axios 依然是開發者的首選。Axios 是一個基於 Promise 的 HTTP 庫,它將許多瑣碎的網路處理簡化為直觀的配置與強大的功能。

為什麼在 Node.js 中選擇 Axios?

  1. 自動 JSON 處理:Axios 會自動將發送的資料轉為 JSON,並自動解析回傳的 JSON 響應。
  2. 攔截器 (Interceptors):能在請求發出前或回應到達後統一進行加工。
  3. 更強大的錯誤處理:Axios 會將非 2xx 的狀態碼視為錯誤,並提供詳細的錯誤物件。
  4. 超時控制與連線池:配置比原生 fetch 更加直觀。

安裝與基礎用法

npm install axios
const axios = require('axios');

async function getProfile() {
  try {
    const response = await axios.get('https://api.github.com/users/octocat');
    // response.data 就是已經解析好的 JSON 物件
    console.log(`GitHub 用戶:${response.data.name}`);
  } catch (error) {
    // 區分不同類型的錯誤
    if (error.response) {
      console.error('伺服器回報錯誤:', error.response.status);
    } else {
      console.error('網路連線失敗:', error.message);
    }
  }
}

核心殺手鐧:攔截器 (Interceptors)

你可以建立全域的邏輯,例如每發出一個請求就自動帶上 JWT Token:

// 請求攔截器
axios.interceptors.request.use((config) => {
  const token = 'YOUR_SECRET_JWT';
  config.headers.Authorization = `Bearer ${token}`;
  return config;
});

// 回應攔截器
axios.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.response.status === 401) {
      console.log('權限過期,導向登入頁面...');
    }
    return Promise.reject(error);
  }
);

實戰:建立自定義實例 (Instance)

如果你的專案需要對接多個不同的 API(如支付系統與內容系統),你可以為它們建立獨立的實例。

const paymentApi = axios.create({
  baseURL: 'https://api.stripe.com/v1',
  timeout: 5000,
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
});

const contentApi = axios.create({
  baseURL: 'https://cms.example.com',
  timeout: 2000,
});

// 使用時非常簡潔
paymentApi.post('/charges', { amount: 100 });

進階生態:自動重試 (Axios Retry)

在微服務架構中,網路抖動是常有的事。你可以搭配 axios-retry 來實現自動重試機制:

npm install axios-retry
const axiosRetry = require('axios-retry');
axiosRetry(axios, { retries: 3 }); // 發生錯誤時自動重試 3 次

總結

  1. 如果是簡單的隨手小程式,fetch 就夠了。
  2. 對於需要統一管理 Authentication、日誌追蹤與錯誤處理的正式專案,Axios 是絕對的利器。
  3. 學會使用 實例化 (Instance)攔截器 能讓你的 API 串接層變得極其乾淨、好維護。