为什么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万美元。 在这里,我想确保没有错误到达事件循环,如果是的话,用一个详细的堆栈跟踪杀死进程,以便以后分析。
- 如何在快速error handling中使用return
- 如何在asynchronous操作期间使Express.jslogging错误
- JavaScript:Try / Catch vs错误函数作为parameter passing
- 如何从node-webworker-threads中获得控制台的错误?
- 在node.js中发送HTTP响应
- 在Express和Restify中处理uncaughtException
- 如何在nodejs和express中处理exception
- Express 4 / Node JS – 非常好地pipe理uncaughtException
- 为什么express的默认error handling程序行为将堆栈跟踪返回给客户端?