Node.js Axios:更強大的 HTTP 請求工具
雖然現代 Node.js 已內建了全域的 fetch API,但在許多中大型專案中,Axios 依然是開發者的首選。Axios 是一個基於 Promise 的 HTTP 庫,它將許多瑣碎的網路處理簡化為直觀的配置與強大的功能。
為什麼在 Node.js 中選擇 Axios?
- 自動 JSON 處理:Axios 會自動將發送的資料轉為 JSON,並自動解析回傳的 JSON 響應。
- 攔截器 (Interceptors):能在請求發出前或回應到達後統一進行加工。
- 更強大的錯誤處理:Axios 會將非 2xx 的狀態碼視為錯誤,並提供詳細的錯誤物件。
- 超時控制與連線池:配置比原生
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 次
總結
- 如果是簡單的隨手小程式,
fetch就夠了。 - 對於需要統一管理 Authentication、日誌追蹤與錯誤處理的正式專案,Axios 是絕對的利器。
- 學會使用 實例化 (Instance) 與 攔截器 能讓你的 API 串接層變得極其乾淨、好維護。