1

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

但是,有时请求会中断,例如,该站点具有 404 代码,或者该站点根本不存在。当请求一批 URL 时,如果在请求的 1000 个 URL 中的第 200 个 URL 上有 404 代码,则整个脚本会中断。这是我的代码:

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

4

5 回答 5

1

使用 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
    }
};
于 2013-03-18T15:23:47.590 回答
1

您需要将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);
  });
});
于 2013-03-18T17:02:37.120 回答
0

您可以使用 uncaughtException 事件。这让脚本即使在异常之后也能运行。关联

process.on('uncaughtException', function(err) {
  console.log('Caught exception: ' + err);
});
于 2013-03-18T15:25:02.617 回答
0

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

于 2013-04-04T09:22:56.620 回答
0
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);
};

添加了出现错误时的回调。记录在控制台上返回错误的站点。此错误通常由 404 或请求时间过长触发。

于 2013-03-20T14:01:40.263 回答