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

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 に答える
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 に答える
0

uncaughtExceptionイベントを使用できます。これにより、例外が発生した後でもスクリプトを実行できます。リンク

process.on('uncaughtException', function(err) {
  console.log('Caught exception: ' + err);
});
于 2013-03-18T15:25:02.617 に答える
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 に答える
0

完全なドキュメントは、執筆時点でhttp://nodejs.org/api/http.html#http_http_get_options_callbackにあります。loganfsmyth の回答は、役立つ例を提供します。

于 2013-04-04T09:22:56.620 に答える