首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Node.js http.get 流式響應分塊返回的原理與正確處理姿勢

     編輯:程式設計疑難解答

現象解釋

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) 防止掛起;
  • Keep-Alive:默認開啟,高併發場景建議使用 agent: new http.Agent({ keepAlive: true, maxSockets: 100 })。

進階:使用 async/await 封裝

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 等高級庫,內建超時、重試、解碼、取消等能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved