繁体   English   中英

NodeJS域错误处理未处理ReferenceError

[英]NodeJS domain error handling not picking up ReferenceError

我在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帖子:

在Mocha中测试NodeJS时,域无法正确捕获错误

NodeJS域和expressjs

请让我知道是否有更多信息可以添加以帮助澄清。

我已经接受了,遗憾的是,似乎没有一种方法可以完全解决使用Domains的所有错误。

我所做的事情远非我想要的-我已经在其他路由之后专门设置了expressjs错误处理路由。 我已将错误处理隔离到其自己的功能,并且Domain和expressjs路由均指向该错误处理功能。

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

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

当时的策略是:

  • 域:我可以预测的错误//专门抛出//注意
  • Express.js:我无法预测的意外错误

编码:

 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) }); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM