1

ノードjsアプリケーションを書いています。request と Cheerio を使用して、一連の URL を読み込み、サイトに関する多くの情報を取得しています。取得しようとしているのはタイトルだけだとしましょう。

var urls = {"url_1", "url_2", "url_3",...,"url_n"};   
for(var i=0; i<urls.length; i++)
{
     getDOMTitle(urls[i],function(error,title){
         if(error)
            console.log("Error while getting title for " + urls[i]);
         else
            console.log("The title for " + urls[i] + " is " + title);
     });
}     

これは私の getDOMTitle メソッドがどのように見えるかです:

function getDOMTitle(urlReq,callback)
{
      var request = require('request');
      var cheerio = require('cheerio');
      request({url:urlReq},function(error, response, doc){
           var $ = cheerio.load(doc);
           if(error)
           {
              callback(true,null);
           }
           else
           {
              $('title', 'head').each(function (i, elem) {
                 var title = $(this).text();
                 callback(false,title);
               });     
           }
      }
}

モジュールがキャッチされない例外をスローした場合、その状況をどのように処理すればよいですか? 私は以下を追加しようとしました:

  process.on('uncaughtException', function (err) {
    console.error(err);
    console.log("Node NOT Exiting...");
    callback(true,null);
  });

これを行うと、送信されたヘッダーを設定できないというエラーが表示されます。プロセス エラー処理からコールバックを削除すると、そのエラーは表示されませんが、コールバックを呼び出していないと想定しているため、クライアントは長時間スピンします。

どうすればこれを解決できますか?

また、アプリケーションレベルでキャッチされていない例外をキャッチできるので、すべてのメソッドでキャッチするためにコードを複製する必要がないことをどこかで読んだことがありますが、それは可能ですか? それがあり、例外をスローしたメソッドが何らかの情報でコールバックすることが期待される場合、それはどのように達成できますか?

ありがとうございました、

4

1 に答える 1

2

あなたの述べた質問に答えるために、一般的なエラートラップメカニズムとしてキャッチされていない例外ハンドラーを使用することは、一般的に貧弱な設計と見なされます。終了する前にクリーンアップを実行する必要がある、回復不可能な状況以外の処理にこれを使用するのは誤った経済です。

サンプルコードにいくつかの問題があります。forループでは、すべてのコールバックは、配列内の最後のURLで機能していることを報告します。これは、すべてのコールバックがi、実行時までに最大値になる同じコピーを参照しているためです。各コールバックにのプライベートコピーを与えるには、ヘルパー関数または即時関数呼び出しを使用する必要がありますi

getDOMTitleエラーコールバックにはが必要でありcallback(error)、ループ内のコードにはエラーメッセージに戻り値が含まれている必要があります。成功コールバックはnull最初のパラメーターとして使用する必要がありますが、これは単なる慣例の問題です。

于 2012-08-17T19:32:09.263 に答える