9

我已经阅读了几个小时关于 Node.js 异常处理的文章。我了解 using 的缺点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);
    });
});

该错误显示在控制台中,但控制台从未收到“服务器域错误...”消息。我也尝试将请求/响应包装在他们自己的域中,但无济于事。更令人失望的是,使用以下内容也不起作用:

process.on('uncaughtException', function(err) {
    console.log('uncaughtException caught the error');
});

难道我做错了什么?我从这里去哪里?我怎样才能捕捉到上述错误?

4

2 回答 2

5

发生这种情况是因为 Express 自己处理可能出现的错误,从而简化了您的工作。有关错误处理,请参阅快速指南。您应该使用下面的结构来处理可能出现的错误:

app.use(function(err, req, res, next){
    console.error(err.stack);
    res.send(500, 'Something broke!');
});
于 2014-05-27T07:43:31.687 回答
5

You can use connect-domain.

The problem is that the exception happens during Connect's routing, which has both a try/catch block around its execution, as well as a default error handler which prints out stack trace details when running in a non-production mode. Since the exception is handled inside of Express, it never reaches your outer layer for the domains to handle.

Here is an example why to use connect-domain package instead of 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);
});
于 2014-05-27T10:23:20.530 回答