我在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
如果我可以添加更多信息以帮助澄清,请告诉我。
答案 0 :(得分:1)
我已经接受了,遗憾的是,使用域名似乎无法完全处理每个错误。
我所做的远非我想要的 - 我已经在其他路线之后专门设置了一个快速错误处理路线。我已将错误处理隔离到其自己的函数,Domain和expressjs路由都指向该错误处理函数。
无论出于何种原因,这似乎捕获了域拒绝捕获的意外错误(如ReferenceError)。因此,我同时使用两个错误捕获。我有点担心这种方法可能出现的重叠和潜在的冲突。
纯猜想:似乎某些错误不会发出错误事件,这可能是域未触发的原因。
策略是:
代码:
finish()