在 Express 和 Restify 中处理 uncaughtException

Zhe*_*Zhe 6 error-handling node.js

我同时使用restify和express。

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

server = restify.createServer(serverSettings);
Run Code Online (Sandbox Code Playgroud)

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

server.on('uncaughtException', function(req, res, route, err) {})
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ben*_*aum 4

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

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


使用

域是在 0.8 版本中引入的,并且正在开发中,所以它们是相当新的。在 0.10 范围内,它们相当稳定。它们提供了一种处理“uncaughtException”事件的最佳方法。域名非常棒,已弃用:D。它不特定于express,或任何其他特定的框架或库。

一般来说,域可以让您进行代码分离。您在域中启动的所有内容都会让该域捕获它。它们可以让您获得简洁的堆栈跟踪,并告诉服务器发生错误时该怎么做。您甚至可以将域用于服务器中的特定部分,但请记住,异常在 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
});
Run Code Online (Sandbox Code Playgroud)

我还在这里为异步异常编写了一个简单的 try/catch,以防您发现有趣:)