为什么NodeJS域的文档代码试图终止这个过程?

在官方的NodeJS文档中,有一些代码示例,当域中出现exception时,进程将尝试正常退出(它closures连接,等待其他请求并等待一段时间,然后退出)。

但为什么不发送500错误,继续工作?

在我的应用程序中,我想在用户input无效时抛出一些预期的错误(如FrontEndUserError),并在中间件的某处捕获这些exception,以便向客户端发送相当错误的消息。 有了领域,它很容易实现,但是这有什么陷阱吗?

app.use (err, req, res, next) -> if err instanceof FrontEndUserError res.send {error: true, message: err.message} else log err.trace res.send 500 

从域模块官方文档:

由于JavaScript在JavaScript中的工作原理,几乎没有任何方法可以安全地“捡起你离开的地方”,而不会泄漏引用或创build其他某种不明确的状态。

回应抛出的错误最安全的方法是closures进程…

对我来说,这意味着当你的NodeJS应用程序抛出一个错误,那么你很不幸。 如果你关心你的应用程序是如何工作的,结果对你来说很重要,那么你最好的办法是杀死这个进程并重新启动。 然而,在最后几秒钟,你可以对其他客户更好,让他们完成他们的工作,对新客户说声抱歉,如果你愿意,logging几件事情,然后杀死进程并重新启动。

这正是NodeJS域模块文档示例中发生的事情。

让我们看看你的web应用/服务器是一个状态机。

除非您的应用程序非常小,否则您不可能知道您的计算机可能处于的每个状态。发生错误时,您有两个select:

1)检查错误,并决定要做什么,或

2)忽视它。

在第一种情况下,你优雅地从一个状态改变到另一个状态。 在第二种情况下,你不知道你的机器处于什么状态,因为你不知道错误是什么。 实质上,你的机器的状态现在是“未定义的”。

正是出于这个原因,NodeJSbuild议如果错误传播到事件循环,则会终止进程。 再次,这个级别的赦免对于宠物项目和小应用程序来说可能是过度的,所以你的解决scheme也相当好。

但想象一下,如果你正在写一个银行软件, 总有一天你会遇到一个你从未见过的错误,你的应用程序简单地忽略它,并发送一个500; 但每次有人失去了10万美元。 在这里,我想确保没有错误到达事件循环,如果是的话,用一个详细的堆栈跟踪杀死进程,以便以后分析。