http.get 回調中的 data 事件會觸發多次,每次傳遞一個 Buffer 片段(chunk)。這是 HTTP/1.1 分塊傳輸編碼 或 TCP 流式傳輸的自然行為:服務端分多次發送數據包,客戶端隨到隨處理,而非一次性緩存完整響應體。
const http = require('http');
function fetch(url, callback) {
http.get(url, (res) => {
const chunks = [];
res.on('data', (chunk) => chunks.push(chunk));
res.on('end', () => {
const data = Buffer.concat(chunks).toString('utf8');
callback(null, data);
});
}).on('error', callback);
}
charset,需用 iconv-lite 根據 content-type 或啟發式檢測解碼;stream.pipe(fs.createWriteStream()) 避免內存暴漲;req.setTimeout(5000) 防止掛起;agent: new http.Agent({ keepAlive: true, maxSockets: 100 })。async function fetchText(url) {
return new Promise((resolve, reject) => {
http.get(url, res => {
const chunks = [];
res.on('data', c => chunks.push(c));
res.on('end', () => resolve(Buffer.concat(chunks).toString()));
}).on('error', reject);
});
}
分塊返回是 HTTP 協議設計使然,而非 Node.js 特有。正確姿勢是監聽 data 事件累積 Buffer,在 end 事件中拼接處理。生產環境推薦使用 axios、got 等高級庫,內建超時、重試、解碼、取消等能力。