1. 程式人生 > >Nodejs HTTP請求的超時處理 Nodejs HTTP Client Request Timeout Handle

Nodejs HTTP請求的超時處理 Nodejs HTTP Client Request Timeout Handle

問題

Nodejs原生的http.request 方法是不支援設定超時引數的,
而網路請求經常會遇到超時的情況,特別是對於外部網路,如果不處理超時,發起的請求將會一直卡主,消耗的系統資源也不能及時被釋放。

解決方案(新, 有問題,socket會重用,設定超時會有問題):擴充套件http.ClientRequest, 增加setTimeout方法

var http =require('http');
http.ClientRequest.prototype.setTimeout =function(timeout, callback){varself=this;if(callback){self
.on('timeout', callback);}self.connection.setTimeout(timeout,function(){self.abort();self.emit('timeout');});};

解決方案(舊)

定時器:通過定時器,當timeout事件觸發的時候,主動呼叫req.abort() 終止請求,
然後返回超時異常。

Request Timeout & Response Timeout

  • 超時有請求超時(Request Timeout):HTTP客戶端發起請求到接受到HTTP伺服器端返回響應頭的這段時間,如果超出設定時間,則表示請求超時。
  • 響應超時(Response Timeout):HTTP伺服器端開始傳送響應資料到HTTP客戶端接收全部資料的這段時間,如果超出設定時間,則表示響應超時。

示例程式碼:Timeout Demo

var http =require('http');var request_timer =null, req =null;// 請求5秒超時
request_timer = setTimeout(function(){
    req.abort();
    console.log('Request Timeout.');},5000);var options ={
    host:'www.google.com',
    port:80,
    path:'/'};
req = http.get(options,function(res){
    clearTimeout
(request_timer);// 等待響應60秒超時var response_timer = setTimeout(function(){         res.destroy();         console.log('Response Timeout.');},60000);     console.log("Got response: "+ res.statusCode);var chunks =[], length =0;     res.on('data',function(chunk){         length += chunk.length;         chunks.push(chunk);});     res.on('end',function(){         clearTimeout(response_timer);var data =newBuffer(length);// 延後copyfor(var i=0, pos=0, size=chunks.length; i<size; i++){             chunks[i].copy(data, pos);             pos += chunks[i].length;}         console.log('Body:\r\n');         console.log(data.toString());});}).on('error',function(e){// 響應頭有錯誤     clearTimeout(request_timer);     console.log("Got error: "+ e.message);});

有愛

^_^ 希望本文對你有用。