gpt4 book ai didi

javascript - Node 、Express、域、未捕获的异常 - 仍然丢失

转载 作者:IT老高 更新时间:2023-10-28 23:25:15 24 4
gpt4 key购买 nike

我已经阅读了几个小时关于 Node.js 异常处理的文章。我了解使用 uncaughtException 的缺点,我了解关闭进程对于防止“任何事情都可能发生”的任何“未知状态”都有好处。我了解使用 domains是要走的路,我了解如何正确实现域,特别是Explicit Binding ...

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

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

我觉得我不应该将所有内容都包装在 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);
});
});

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

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

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

最佳答案

您可以使用 connect-domain .

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

这里是为什么使用连接域包而不是域的示例。

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);
});

关于javascript - Node 、Express、域、未捕获的异常 - 仍然丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23882854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com