NodeJS域错误处理没有拾取ReferenceError

时间:2015-11-05 17:34:56

标签: javascript node.js asynchronous express error-handling

我在NodeJS中遇到域名问题。我已经设置了一些中间件函数,域名正在包装我在Web应用程序中进行的每个调用。我的目标是能够发现发生的任何错误,处理它,并返回有关发生的错误的有用信息。

这适用于大多数错误,但我看到域要么没有看到,要么在ReferenceError上触发我的事件处理程序。我尝试过很多东西,环顾四周,但无济于事。我认为错误和异常之间可能存在差异,但这是未经证实的。

我注意到,因为我正在侦听Error事件,所以可能在某些类型的错误(如ReferenceError)上未触发此类事件。

我尝试在process.nextTick中包装我的代码,并将错误的代码放在async.js块中。

我尝试使用https://github.com/brianc/node-domain-middleware作为修复程序。

我已尝试侦听域的错误事件,并侦听EventEmitter并将该发射器添加到域中。

同样,使用Domain对象本身的enter和exit方法。我确信现在还有更多我无法记住的事情。

真的,我正在寻找的是一个解决方案,它可以捕获我的nodejs Web应用程序中发生的任何错误,并允许我处理发生的错误。

每次都会执行一个总体中间件,而中间件只能在api调用上运行。 api调用的中间件检查您是否经过身份验证(其工作原理并在应用程序的其他部分进行了验证)。

是的,我已经尝试为这两个中间件中的每个请求创建一个域,我尝试在这两个中间件之间的每个顺序和组合中创建和放置这些error_handling_domain.run语句。每次它始终相同时,没有触发错误处理程序的输出或信号。

代码:



    var error_handling_domain = domain.create();
    var EventEmitter = require('events').EventEmitter;
    var emitter = new EventEmitter();

    error_handling_domain.on('error', function(er) {
      console.log("i caught an error");
      console.log(er);
    });

    emitter.on('error', function(err) {
      console.log("I am an emitter error");
      console.log(err);
    });

    error_handling_domain.add(emitter);

    app.use(function(req, res, next) {
      error_handling_domain.run(function() {
        next();
      });
    });

    app.all('/api/*', function(req, res, next) {
      var original_url_prefix = req.originalUrl.split('/')[1];
      original_url_prefix = (original_url_prefix) ? original_url_prefix.toLowerCase() : "";
      req.user = "me";
      var authentication_required = original_url_prefix === 'api' && !req.user;
      if (authentication_required) {
        res.sendStatus(401);
      } else {
        next();
      }
    });

app.post('/api/my_route/here', handle_post);

function handle_post(req, resp){
  switch(req.body.action){
    case 'download': this.download_report(req.body, resp);
  }
}

function download_report(params, resp){    
  wellhi.thing;    
  resp.json({success: "I guess"});
}




假设我在' / api / my_route / here'上发了帖子,调用download_report并试图引用wellhi.thing,这显然不是真实的东西。这是我使用的测试错误代码。

我正在使用NodeJS和expressjs。我一直在努力熟悉以下几页:

https://nodejs.org/api/errors.html#errors_class_referenceerror

http://tuttlem.github.io/2015/05/16/handling-exceptions-with-domains-in-nodejs.html

https://strongloop.com/strongblog/robust-node-applications-error-handling/

https://nodejs.org/api/domain.html http://www.lighthouselogic.com/node-domains-as-a-replacement-for-try-catch/

我看过的Stackoverflow帖子:

Domains not properly catching errors while testing nodeJS in mocha

NodeJS Domains and expressjs

如果我可以添加更多信息以帮助澄清,请告诉我。

1 个答案:

答案 0 :(得分:1)

我已经接受了,遗憾的是,使用域名似乎无法完全处理每个错误。

我所做的远非我想要的 - 我已经在其他路线之后专门设置了一个快速错误处理路线。我已将错误处理隔离到其自己的函数,Domain和expressjs路由都指向该错误处理函数。

无论出于何种原因,这似乎捕获了域拒绝捕获的意外错误(如ReferenceError)。因此,我同时使用两个错误捕获。我有点担心这种方法可能出现的重叠和潜在的冲突。

纯猜想:似乎某些错误不会发出错误事件,这可能是域未触发的原因。

策略是:

  • 域名:错误我可以预测//特别抛出//注意
  • Expressjs:我无法预测的意外错误

代码:



finish()