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 回答