【问题标题】:handle uncaughtException in Express and Restify在 Express 和 Restify 中处理 uncaughtException
【发布时间】:2013-07-30 05:42:52
【问题描述】:

我同时使用 restify 和 express。

在restify中,我以这种方式创建服务器:

server = restify.createServer(serverSettings);

然后,我可以像这样处理 uncaughtException:

server.on('uncaughtException', function(req, res, route, err) {})

与 process.on('uncaughtException') 不同。因为它捕获了所有的 uncaughtException 并且可以给客户端一个响应。所以我喜欢这种捕捉异常的方式。

但在 Express 中,我找不到这样的东西。

所以就想问一下,快递里有没有同样的东西?或者有什么方法可以实现同样的功能?

【问题讨论】:

    标签: node.js error-handling


    【解决方案1】:

    2014 年更新:回想起来,NodeJS 域有点不稳定和古怪。它们产生了很多边缘情况,而且不是很有趣。 Promise 可能是错误处理的更好选择——像 Bluebird 和 Q 这样的良好 Promise 库会产生良好的堆栈跟踪,而且 Bluebird 速度很快——Promise 还具有捕获安全保证。

    2017 年更新:您绝对应该一次性将异步函数用于您正在执行的任何异步操作,并将其用于异常处理,并使用异步迭代器等工具内置的语言进行异常处理。写回调汤的日子一去不复返了。


    使用domains

    域是在 0.8 版中引入的,并且正在开发中,因此它们是相当新的。在 0.10 中,它们非常稳定。它们为“uncaughtException”事件提供了一种更好的方法。 awesome 已弃用域:D。它不是特定的表达,或任何其他特定的框架或库。

    一般来说,域可以让您进行代码分离。您在域中开始的所有内容都会让域捕获它。它们让您获得简洁的堆栈跟踪,并告诉服务器在发生错误时该怎么做。您甚至可以将域用于服务器中的特定部分,但请记住,在 JS 世界中例外是相对昂贵的东西。

    var d = domain.create();
    d.on('error', function(er) {
       //your handler here    
    });
    d.run(function(){
        //create the server here, 
        //errors thrown will be handled by the domain handler
    });
    

    我还为异步异常编写了一个简单的 try/catch here,以防你觉得有趣:)

    【讨论】:

    • 谢谢本杰明。但是从您的示例中,我可以看到这是捕获所有错误的好方法。但我的问题是如何给客户一个正确的回应。在您的示例中,错误处理函数只有一个错误,响应丢失,这意味着我只是捕获了错误,但无法给出响应。
    • @Zhe 如果您查看我将您链接到(域)的页面,它们会专门显示您如何将请求和响应添加到域以及您想要的地址错误。请参阅标题为“显式绑定”的部分。
    • could 在 express 中使用 "errorHandler" (app.use with a function),但它不像域那么紧密。
    • 谢谢@Benjamin,我刚刚浏览了nodejs doc中的域。这确实是处理错误的好方法。我还检查了 restify 代码,看看他们如何做我在问题中提到的“uncaughtException”事情。我发现他们确实使用域来应用它。所以实际上,我已经在使用它了:)。非常感谢您的帮助。
    • @Zhe 支持查看源代码 - 这始终是处理此类问题的最佳方式。
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 2021-09-13
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多