Node.js HTTP Client:發送網路請求與 Fetch API
在 Node.js 中,你的程式不僅能作為被呼叫的「伺服器」,也能作為主動呼叫外界的「客戶端 (Client)」。這常用於串接第三方 API、擷取網頁內容或進行微服務間的通訊。
現代做法:原生 Fetch API (推薦)
自 Node.js 18 版本起,官方正式內建了全域的 fetch API,其語法與瀏覽器端高度一致。這是目前最推薦、最現代的非同步請求方式。
async function getRandomQuote() {
try {
const response = await fetch('https://api.quotable.io/random');
// 檢查 HTTP 狀態碼
if (!response.ok) {
throw new Error(`連線失敗!狀態碼:${response.status}`);
}
const data = await response.json();
console.log(`名言:${data.content} — ${data.author}`);
} catch (err) {
console.error('請求發生錯誤:', err.message);
}
}
控制請求逾時:AbortController
當你不想讓請求無限期掛起時,可以使用 AbortController。
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 5000); // 5秒即切斷
try {
const res = await fetch(url, { signal: controller.signal });
} finally {
clearTimeout(timeoutId);
}
傳統做法:原生 http/https 模組
在 Fetch 誕生之前,這是 Node.js 唯一的內建手段。它是基於 Stream (串流) 的處理,寫法較為繁瑣,但提供了更精細的 Socket 控制。
http.get (僅讀取)
const https = require('https');
https.get('https://example.com/api', (res) => {
let body = '';
res.on('data', (chunk) => (body += chunk));
res.on('end', () => console.log('收到資料:', body));
});
http.request (發送 POST 數據)
const https = require('https');
const options = {
hostname: 'api.example.com',
method: 'POST',
headers: { 'Content-Type': 'application/json' },
};
const req = https.request(options, (res) => {
console.log(`狀態碼: ${res.statusCode}`);
});
req.write(JSON.stringify({ user: 'Mike' })); // 寫入 Body
req.end(); // 送出請求
Fetch 與原生模組的抉擇
| 特性 | 全域 fetch | 原生 http 模組 |
|---|---|---|
| 語法 | Async / Await (簡潔) | Callback / Stream (繁瑣) |
| JSON 處理 | 內建 .json() | 須手動字串拼接後 parse |
| 適用場景 | 90% 的 REST API 串接 | 底層協定開發、極致效能優化 |
如果你需要自動重試 (Retry)、請求攔截 (Interceptors) 或更強大的檔案上傳功能,我們推薦在下一章了解第三方知名套件 Axios。
總結
- 優先使用全域
fetch,保持代碼與瀏覽器端一致。 - 處理重要請求時,務必搭配
AbortController設定逾時時間。 - 理解原生
http模組有助於你在處理超大型檔案下載(串流模式)時有更好的控制。