NodeJS域错误处理不拾取ReferenceError
我在NodeJS中遇到问题。 我已经设置了一些中间件功能,以便域名在我的Web应用程序中进行每次呼叫时都会进行包装。 我的目标是能够收集发生的任何错误,处理它,并返回有关发生错误的有用信息。
这适用于大多数错误,但我看到该域没有看到,或者在ReferenceError上触发我的事件处理程序。 我已经尝试了很多东西,并环顾了很多地方,但无济于事。 我认为在一个错误和一个异常之间可能存在差异,但这是未经证实的。
我注意到,因为我正在侦听Error事件,所以可能不会像ReferenceError那样触发某些类型的错误。
我已经尝试在process.nextTick中包装我的代码,并将错误的代码放在async.js块中。
我试过使用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"});
}
我承认,似乎没有办法完全处理每个使用域名的错误,遗憾的是。
我所做的与我想要的完全不同 - 我已经在其他路由之后特别设置了expressjs错误处理路由。 我已经将错误处理隔离到它自己的函数中,并且Domain和expressjs路由指向该错误处理函数。
无论出于何种原因,这似乎都会捕获Domains拒绝捕获的意外错误(如ReferenceError)。 因此,我同时使用错误捕获。 我有点担心这种方法可能存在重叠和潜在的冲突。
纯粹猜想:似乎有些错误不会发出错误事件,这可能是域没有触发的原因。
那时的策略是:
代码:
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)
});
链接地址: http://www.djcxy.com/p/46465.html
上一篇: NodeJS domain error handling not picking up ReferenceError
下一篇: Meteor wrapAsync executes synchronously but never returns