【问题标题】:Node - How to handle uncaught exceptions with callbacks in node?Node - 如何使用节点中的回调处理未捕获的异常?
【发布时间】:2023-04-07 11:49:01
【问题描述】:

我正在编写一个节点 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);
  });

当我这样做时,我收到一条错误消息,指出一旦发送了标头,我就无法设置它们。如果我从进程错误处理中删除回调,我看不到该错误,但客户端旋转了很长时间,因为我假设我们从未调用回调。

我该如何解决这个问题?

另外,我在某处读到您可以在应用程序级别捕获未捕获的异常,因此您不必复制代码以在每个方法中捕获它,这可能吗?如果是,并且抛出异常的方法预计会回调一些信息,如何实现?

谢谢,

【问题讨论】:

    标签: node.js process


    【解决方案1】:

    为了回答您提出的问题,使用未捕获的异常处理程序作为一般的错误捕获机制通常被认为是糟糕的设计。用它来处理除不可恢复的情况之外的任何事情是一种虚假的经济,您只需要在退出之前进行一些清理。

    您的示例代码中存在一些问题。在您的 for 循环中,所有回调都将报告它们正在使用您数组中的最后一个 URL,因为它们都引用了 i 的同一个副本,这将是它的最高值他们中的任何一个执行的时间。您需要使用辅助函数或立即函数调用为每个回调提供i 的私​​有副本。

    getDOMTitle 中,错误回调应为callback(error),并且循环中的代码应在错误消息中包含返回值。成功回调应该使用null 作为它的第一个参数,尽管这只是一个约定问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 2015-09-10
      • 2011-10-27
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      相关资源
      最近更新 更多