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

總結

  1. 優先使用全域 fetch,保持代碼與瀏覽器端一致。
  2. 處理重要請求時,務必搭配 AbortController 設定逾時時間。
  3. 理解原生 http 模組有助於你在處理超大型檔案下載(串流模式)時有更好的控制。