Nodejs HTTP請求的超時處理 Nodejs HTTP Client Request Timeout Handle
阿新 • • 發佈:2019-02-20
問題
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);});
有愛
^_^ 希望本文對你有用。