我几天前刚刚开始试用SailsJS 我已经意识到每当我有一个未被捕获的异常时节点就会被终止 我有一个控制器列表,每个控制器调用服务/中的特定服务JS文件(包含逻辑和数据库调用)。 我是否可以为所有服务编写全局错误处理程序,以便应该由它处理从这些服务发生的任何类型的错误,并且必须将适当的错误响应传递给前端。
我尝试使用process.on('uncaughtexception')或一些基本异常,但需要将其添加到每个服务方法中。
对于从客户端到服务器的所有服务调用,我也可以有一个共同的点,所有io.socket.post()和io..socket.get()通过它来完成
我很感激任何指针/文章,它会向我展示在SailsJS中处理未捕获的异常并使用更短的代码而不是在所有服务中编写冗余代码的常见最佳实践。
答案 0 :(得分:4)
最佳做法是在控制器中使用Domains。这将处理异步代码中的异常,并且相对简单。
您可以使用trycatch之类的东西来简化一些事情,但基于域的异常将是最有效的。它可以确保异常不会使您的应用程序崩溃。只需在控制器中创建一个新域,然后在该域内运行控制器方法。
基于快递的Sailsjs可以使用连接中间件,您可以从中间件无缝地创建新域。有express-domain-middleware之类的东西。这可能是最美观的选择,而且最方便。
<强>更新强> 正如Benjamin Gruenbaum所提到的,域名计划在节点的v1中被弃用。也许你应该通读Joyents Error Handling Best Practices。它与您正在使用的框架无关。
另外,你仍然可以使用域名,但是没有办法全局处理node.js中的错误。弃用后,您可以相对轻松地删除对域的依赖。也就是说,最好不要仅依赖域名。
Strongloop还提供了一个受名为Zone的域启发的库。这也是一种选择。
答案 1 :(得分:1)
可以让节点实例由于编程错误而导致错误,否则它可能会继续处于不一致状态并导致业务逻辑陷入混乱。在生产环境中,服务器可以在崩溃时重新启动,如果错误不频繁,这将重置其状态并使其保持可用。在所有这些中,记录所有内容非常重要。这适用于大多数节点设置,包括SailsJS。
可以采取以下方法:
next(err)
可用于将错误传递给中间件链。链末尾的错误捕获中间件将收到此错误,将其记录为详细,并返回500状态。您可以使用Domains
或Zones
或Promises
或async
或您喜欢的任何内容来处理请求并发现错误。 process.on('uncaughtexception')
:记录erorr,进行必要的清理,并再次向关机过程抛出相同的错误。答案 2 :(得分:0)
我没试过这个,但我相信你应该能够使用process.on('uncaughtexception')
在bootstrap.js中设置一个catch-all异常处理程序。
就个人而言,我通过bluebird库使用promises,并将一个catch语句传递给全局错误处理函数。