2013-04-05 40 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