在SailsJS中处理exception的最佳实践

我刚刚开始尝试SailsJS几天前。
我意识到,只要我有一个未捕获的exception,Node就会被终止。
我有一个控制器的列表,他们每个调用服务中的特定服务JS文件(包含逻辑和数据库调用)。
我可以为所有服务编写一个全局error handling程序,以便由这些服务发生的任何types的错误应该由它处理,并且必须将适当的错误响应传送到前端。

我尝试使用process.on('uncaughtexception')或一些基本的例外,但它需要被添加到每个服务方法。

所有的io.socket.post()和io..socket.get()都经历了从客户端到服务器的所有服务调用。

我将不胜感激任何指针/文章,这些指针/文章将向我展示处理SailsJS中的未捕获exception的常见最佳实践,并使用较短的代码而不是在所有服务中编写冗余代码。

最佳做法是在控制器中使用域 。 这将处理asynchronous代码中的exception,并且相对简单。

你可以使用像trycatch这样的东西来简化一些事情,但基于域的exception将是最有效的。 这将确保exception不会导致您的应用程序崩溃。 只需在控制器中创build一个新的域,然后在该域内运行控制器方法即可。

Sailsjs基于express,可以使用连接中间件,并且可以从中间件无缝地创build一个新的域。 有express-domain-middleware这样的东西。 这可能是最美观的select,也是最方便的。

更新: 正如本杰明·格鲁恩鲍姆(Benjamin Gruenbaum)所提到的,域名计划在节点v1中被弃用。 也许你应该阅读Joyentserror handling最佳实践 。 它对你正在使用的框架是不可知论的。

此外,您仍然可以使用Domains,但是否则无法全局处理node.js中的错误。 一旦不推荐使用,您可以相对容易地删除对域名的依赖。 也就是说,最好不要单靠域名。

Strongloop还提供了一个由域名启发的图书馆。 这也是一个select。

它可以让节点实例错误,由于编程错误,否则它可能会继续处于不一致的状态和混乱的业务逻辑。 在生产环境中,服务器可以在崩溃时重新启动,如果错误不频繁,则会重置其状态并保持可用状态。 在所有这一切logging一切都非常重要。 这适用于大部分节点设置,包括SailsJS。

可以采取以下方法:

  1. 使用logging器:应该可以访问服务器组件的专用logging器。 应该连接到一个通知开发者(email?)的非常严重错误的服务。
  2. 将每个请求错误传播到最后:仔细转发请求处理中的任何步骤的错误。 在ExperssJs / ConnectJs /基于中间件的安装程序中,可以使用next(err)将错误传递给中间件链。 在链末端捕获中间件的错误会得到这个错误,将其logging为详细的,并发回一个500的状态。 您可以使用DomainsZonesPromisesasync或任何你喜欢的来处理请求和捕获错误。
  3. closuresprocess.on('uncaughtexception') :loggingerorr,进行必要的清理,并将相同的错误再次closures进程。
  4. Linux上的用户PM2 / Forever或Upstart / init.d:现在当由于exception而导致进程closures时,这些工具将重新启动并跟踪服务器崩溃的次数。 如果服务器崩溃的方式太多了,那就停下来立即采取行动。

我还没有尝试过,但我相信你应该能够使用process.on('uncaughtexception')在bootstrap.js中设置一个catch-allexception处理程序。

就个人而言,我通过蓝鸟库使用承诺,并把一个catch语句,将所有错误传递给全局error handling函数。