Node.js 在express 4中发生未捕获错误后,如何呈现500响应?
我已经尝试了一堆域中间件,但它们都只适用于express 3。我目前使用的是express 4.5,我想知道express是否改变了该域,使其不再工作Node.js 在express 4中发生未捕获错误后,如何呈现500响应?,node.js,Node.js,我已经尝试了一堆域中间件,但它们都只适用于express 3。我目前使用的是express 4.5,我想知道express是否改变了该域,使其不再工作 当前,当抛出异常时,响应基本上会挂起,直到超时。假设您遇到的错误在路由器或控制器内部 在收听之前,请将此信息放在应用程序配置的最后 app.get('/', function(req, res) { doSomethingAsync(function(err) { throw new Error('some unexpected
当前,当抛出异常时,响应基本上会挂起,直到超时。假设您遇到的错误在路由器或控制器内部 在收听之前,请将此信息放在应用程序配置的最后
app.get('/', function(req, res) {
doSomethingAsync(function(err) {
throw new Error('some unexpected/uncaught async exception is thrown');
})
})
Possibly unhandled Error: some unexpected/uncaught async exception is thrown
at ...stacktrace...:95:9
From previous event:
at ...stacktrace...:82:6)
at ...stacktrace...:47:6)
at ...stacktrace...:94:18)
您的应用程序将捕获任何未捕获的路由器错误,并将呈现“错误”页面
顺便说一下,不要忘记在路由器初始化中包含“下一步”
编辑
app.use(function(err, req, res) {
res.status(err.status || 500);
// if you using view enggine
res.render('error', {
message: err.message,
error: {}
});
// or you can use res.send();
});
希望对您有所帮助正如您所发现的,尝试
尝试
/捕获
异步函数不起作用。在Express4(或Express3,或直接http,无论什么)中都可以正常工作。不过,我从未使用过任何尝试实现域处理的express中间件,因此我无法真正说明它们的工作情况
我建议您自己实现域处理;没那么糟。使用域的一个更好的例子是right in(不是他们展示的第一个坏例子,第二个好例子)我强烈建议您阅读这些文档。
基本思想非常简单:
domain.run(function(){…})
将所需代码放入该运行回调中的域中集群
(或类似的方法)启动多个工作进程,这些工作进程从主进程运行web服务器。在每个工作进程中,设置一个域,当抛出错误时,该域将很好地返回500状态,然后退出。然后,在主进程中,检测工作进程何时退出,并简单地启动一个新的工作进程
这样做的目的是消除“从哪里开始”的任何问题,只要在抛出错误时重新启动整个过程,但只有在优雅地处理之后
在SO答案中举一个这样的例子可能有点过分,但确实有一个很好的例子。如果你还没有,那就去看看吧。:) 使用:
res.send(500)代码>在异步进程中有一个未捕获的表达式。此时,我已经无法访问res对象。如果出现错误,请使用res.status(500).end()
注意:res.send(status)
将错误传递给回调。我无法将错误传递给回调。也许我解释得不对。这是一个意外的例外。一个意外的异常被抛出,我没有捕捉到。捕捉它!ButterFingers我已经尝试过了,但只有当错误被抛出路由器内部时,它才起作用。如果错误是在异步进程中抛出的,那么它就不会捕获它!用try&catch包装您的异步进程怎么样?如果出现错误,请执行此“下一步(e)”我知道这是一个旧答案,但我想补充一点,域现在处于弃用警告之下。我想知道一旦域名消失,会有什么来解决这个问题。
app.get('/', function(req, res, next) {
try {
signin(req.query.username, req.query.password, function(d){
if (d.success) {
req.session.user = d.data;
}
res.end(JSON.stringify(d));
});
} catch(e) {
next(e);
}
}
// This will alwas throw an error after 100ms, but it will still
// nicely return a 500 status code in the response.
app.get('/', function(req, res) {
var d = domain.create();
d.on('error', function(err) {
res.status(500).send(err.message);
});
d.run(function() {
setTimeout(function() {
throw new Error("some unexpected/uncaught async exception");
}, 100);
});
});