Node.js 在express 4中发生未捕获错误后,如何呈现500响应?

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

我已经尝试了一堆域中间件,但它们都只适用于express 3。我目前使用的是express 4.5,我想知道express是否改变了该域,使其不再工作


当前,当抛出异常时,响应基本上会挂起,直到超时。

假设您遇到的错误在路由器或控制器内部 在收听之前,请将此信息放在应用程序配置的最后

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(){…})
    将所需代码放入该运行回调中的域中
  • 一个非常简单(且非常本地化)的示例:

    因此,这将起作用,对于您的案例来说可能已经足够了,但这并不是最好的解决方案(如果您阅读了文档,您可能会注意到这与他们的坏示例非常接近)。问题是(再次从文档中):

    就抛出在JavaScript中的工作原理而言,几乎 从来没有任何方法可以安全地“拾起你离开的地方”,而不会泄漏 引用,或者创建其他类型的未定义的脆性状态

    最好的解决方案(据我所知)是按照节点文档中的建议执行。他们建议的基本思想是使用
    集群
    (或类似的方法)启动多个工作进程,这些工作进程从主进程运行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);
        });
    });