2013-04-05 42 views
3

我需要連接到一個網頁,並返回頁面,我已經能夠使用http.request但我需要請求的頁面可能需要較長時間才能達到的狀態代碼,有時幾分鐘,所以我總是得到一個socket hang up錯誤。Node.js的請求的網頁

我用下面的代碼至今:

var reqPage = function(urlString, cb) { 
    // Resolve the URL 
    var path = url.parse(urlString); 
    var req = http.request({ 
     host: path.hostname, 
     path: path.pathname, 
     port: 80, 
     method: 'GET' 
    }); 
    req.on('end', function() { 
     cb.call(this, res); 
    }); 
    req.on('error', function(e) { 
     winston.error(e.message); 
    }); 
}; 

什麼我需要做什麼來確保我的應用程序仍然會嘗試連接到的頁面,即使它會需要幾分鐘?

回答

5

使用request模塊和超時選項設置爲合適的值(以毫秒爲單位)

var request = require('request') 
var url = 'http://www.google.com' // input your url here 

// use a timeout value of 10 seconds 
var timeoutInMilliseconds = 10*1000 
var opts = { 
    url: url, 
    timeout: timeoutInMilliseconds 
} 

request(opts, function (err, res, body) { 
    if (err) { 
    console.dir(err) 
    return 
    } 
    var statusCode = res.statusCode 
    console.log('status code: ' + statusCode) 
}) 
+0

完美!謝謝。它現在已經請求了幾分鐘的網頁,而不是放棄。乾杯。 – James 2013-04-05 16:27:57

+0

啊,一段時間後,有一次我請第二頁我'ECONNREFUSED'。 – James 2013-04-05 16:30:55

+0

這可能與服務器有關。這就是說你可以使用async模塊的while函數重試每個請求直到成功。 https://github.com/caolan/async#whilst – Noah 2013-04-05 16:39:51

0

添加這個,如果你不希望使用一個更高級別的HTTP客戶端就像requestsuperagent,再加入這...

req.on("connection", function(socket){ 
    socket.setTimeout((1000*60*5)); //5 mins 
}); 
+0

啊哈!那就是我稱之爲'setTimeout'的歡呼聲。 – James 2013-04-05 16:32:11

+0

即使有這個,我也會'套接字掛斷'。 – James 2013-04-05 16:34:08

+0

你確定連接成功嗎?你確認你有連接,並且連接因爲沒有數據響應而超時?您可以將日誌記錄添加到「連接」事件,並且還可以登錄套接字「關閉」事件。我還將一個日誌語句添加到套接字「錯誤」事件中,以便查看發生了什麼。根據你所描述的內容,你連接的服務器可能是丟棄連接的服務器,在這種情況下,沒有客戶端配置可以解決這個問題。如果套接字長時間不活動,防火牆超時可能會困擾您。 – kberg 2013-04-11 00:48:28