javascript - NodeJS 域错误处理未拾取 ReferenceError

标签 javascript node.js asynchronous express error-handling

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

这适用于大多数错误,但我发现域要么没有看到,要么在 ReferenceError 上触发我的事件处理程序。我尝试了很多事情,也看了很多地方,但都没有效果。我认为错误和异常之间可能存在差异,但这尚未得到证实。

我注意到,由于我正在监听 Error 事件,因此某些类型的错误(例如 ReferenceError)可能不会触发此类事件。

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

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

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

以及使用 Domain 对象本身的进入和退出方法。我确信还有更多的事情我现在记不清了。

实际上,我所寻找的只是一个能够捕获 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

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

最佳答案

遗憾的是,我已经接受似乎没有一种方法可以完全处理使用域的每个错误。

我所做的与我想要的相去甚远 - 我专门在其他路由之后设置了一个expressjs错误处理路由。我已将错误处理隔离到其自己的函数中,并且 Domain 和expressjs 路由都指向该错误处理函数。

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

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

策略是:

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

代码:

function error_handling(err, req, res) {
  console.log("hello im an error.");   
}

var error_handling_domain = domain.create();
error_handling_domain.on("error", error_handling);

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

app.use('/api', function(req, res, next){      
  var authentication_required = <check_for_auth>;
  if(authentication_required) {
    res.sendStatus(401);                
  } else {        
    next();                   
  }  
});

var routes = require('routes.js');
routes.initialize(app);

app.use(function(err, req, res, next) {
  error_handling(err, req, res)
});

关于javascript - NodeJS 域错误处理未拾取 ReferenceError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33551153/

相关文章:

javascript - 生成器和 Promise - 尝试结合

android - 有人可以解释如何在 Android 中使用 ASyncTask 吗?

javascript - 字符串与node.js比较

javascript - 将 Node.js Express 变量传递给我的静态 javascript 文件

javascript - JQuery Mobile .page() 函数导致无限循环?

node.js - 为什么 fs.readFileSync() 比 await fsPromises.readFile() 快?

mysql - 从 Node.js 将 Json 存储到 MySQL 数据库中

java - 如何在java库中处理异步响应?

javascript - ExtJs 5 : Loading Mask in GridView

javascript - 是否可以使用angular js在html脚本中编写数组?