请求来自不存在的站点的HTTP响应时,Node.js脚本将中断

使用Node.js,当请求HTTP响应时,在最佳情况下,请求返回一个HTTP响应。

但是,有时请求会因为网站的404代码或网站根本不存在而中断。 当请求一批URL时,如果在所请求的1000个URL中有第404个代码(例如,第200个URL),则整个脚本会中断。 这是我的代码:

var hostNames = ['www.gizmodo.com','www.sitethatdoesnotexist123.com','www.google.com']; for (i; i < hostNames.length; i++){ var options = { host: hostNames[i], path: '/' }; (function (i){ http.get(options, function(res) { var obj = {}; obj.url = hostNames[i]; obj.statusCode = res.statusCode; obj.headers = res.headers; db.scrape.save(obj); }).on('error',function(e){ console.log("Error Site: " + hostNames[i]); }); })(i); }; 

有没有办法,例如,如果该网站不存在,我只是跳到下一个url,而不是脚本中断?

编辑:修正。 感谢用户DavidKemp

使用try / catch块捕获可能发生的任何错误,然后从那里继续。

例如:

 var hostNames = ['www.gizmodo.com','www.sitethatdoesnotexist123.com','www.google.com']; //moved the function out so we do not have to keep redefining it: var get_url = function (i){ http.get(options, function(res) { var obj = {}; obj.url = hostNames[i]; obj.statusCode = res.statusCode; obj.headers = res.headers; console.log(JSON.stringify(obj, null, 4)); }) }; for (i; i < hostNames.length; i++){ var options = { host: hostNames[i], path: '/' }; try { get_url(i); } catch(err){ //do something with err } }; 

您需要将error处理程序绑定到您的请求。 我也清理了一下代码。

 hostNames.forEach(function(hostname), { var req = http.get({host: hostName}, function(res) { var obj = { url: hostName, statusCode: res.statusCode, headers: res.headers }; console.log(JSON.stringify(obj, null, 4)); }); req.on('error', function(err){ console.log('Failed to fetch', hostName); }); }); 

你可以使用uncaughtException事件。 这让脚本在exception之后运行。 链接

 process.on('uncaughtException', function(err) { console.log('Caught exception: ' + err); }); 
 var hostNames = ['www.gizmodo.com','www.sitethatdoesnotexist123.com','www.google.com']; for (i; i < hostNames.length; i++){ var options = { host: hostNames[i], path: '/' }; (function (i){ http.get(options, function(res) { var obj = {}; obj.url = hostNames[i]; obj.statusCode = res.statusCode; obj.headers = res.headers; db.scrape.save(obj); }).on('error',function(e){ console.log("Error Site: " + hostNames[i]); }); })(i); }; 

添加了一个callback,当有一个错误。 logging在控制台上返回错误的站点。 这个错误通常是由404或者请求时间太长而引发的。

完整的文档在撰写本文时位于http://nodejs.org/api/http.html#http_http_get_options_callback 。 loganfsmyth的答案提供了一个有用的例子。