节点,Express,域,未捕获的异常 - 仍然丢失

Rya*_*ale 9 javascript error-handling node.js express node.js-domains

我已经在Node上阅读了几个小时的异常处理.我理解使用的缺点uncaughtException,我知道关闭这个过程有利于防止任何"未知状态","任何事情都可能发生".我理解使用是一种方法,我理解如何正确实现域,特别是显式绑定 ...

...但我仍然没有得到任何结果只是基本的错误处理.

我希望能够捕获任何未捕获的异常以进行日志记录.我不介意杀死这个过程或任何其他被认为是"不受欢迎的".我只想要一个日志.

我不觉得我应该把所有东西都包在try/catch中或者使用一些库来解决emit错误...如果我错了请纠正我,我会改变我的方式.

我正在使用Node和Express,我有以下简单的代码:

var express = require('express');
var domain = require('domain');

var serverDomain = domain.create();
serverDomain.on('error', function(err) {
    console.log("SERVER DOMAIN ERROR: " + err.message);
});

serverDomain.run(function() {
    var app = express();
    app.get('/testing', function() {
        app.nonExistent.call(); // this throws an error
    });

    var server = app.listen(8000, function() {
        console.log('Listening on port %d', server.address().port);
    });
});
Run Code Online (Sandbox Code Playgroud)

错误显示在控制台中,但控制台从未收到"SERVER DOMAIN ERROR ..."消息.我也尝试在自己的域中包装请求/响应,但无济于事.更令人失望的是,使用以下内容也不起作用:

process.on('uncaughtException', function(err) {
    console.log('uncaughtException caught the error');
});
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?我从哪里开始?我怎样才能发现上述错误?

mic*_*nic 5

发生这种情况是因为Express会自行处理可能出现的错误,并以这种方式简化您的工作.有关错误处理,请参阅Express Guide.您应该使用下面的结构来处理可能出现的错误:

app.use(function(err, req, res, next){
    console.error(err.stack);
    res.send(500, 'Something broke!');
});
Run Code Online (Sandbox Code Playgroud)


Waq*_*med 5

您可以使用connect-domain.

问题是在Connect的路由期间发生了异常,它在执行时都有一个try/catch块,以及一个默认的错误处理程序,它在非生产模式下运行时打印出堆栈跟踪详细信息.由于异常是在Express内部处理的,因此它永远不会到达外层以供域处理.

以下是使用connect-domain包而不是domain的示例.

http://masashi-k.blogspot.com/2012/12/express3-global-error-handling-domain.html

var express = require('express');
var connectDomain = require('connect-domain');

var app = express();
app.use(connectDomain());
app.get('/testing', function() {
    app.nonExistent.call(); // this throws an error
});

app.use(function(err, req, res, next) {
    res.end(err.message); // this catches the error!!
});

var server = app.listen(8000, function() {
    console.log('Listening on port %d', server.address().port);
});
Run Code Online (Sandbox Code Playgroud)