簡體   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