首页 文章

在SailsJS中处理异常的最佳实践

提问于
浏览
14

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

我尝试使用process.on('uncaughtexception')或一些基本异常,但需要将其添加到每个服务方法中 .

对于从客户端到服务器的所有服务调用,我也可以有一个共同的点,所有io.socket.post()和io..socket.get()都通过它来完成

我将非常感谢任何指针/文章,它将向我展示在SailsJS中处理未捕获的异常并使用更短的代码而不是在所有服务中编写冗余代码的常见最佳实践 .

3 回答

  • 1

    最佳做法是在控制器中使用Domains . 这将处理异步代码中的异常,并且相对简单 .

    您可以使用像trycatch之类的东西来简化一些事情,但基于域的异常将是最有效的 . 它可以确保异常不会使您的应用程序崩溃 . 只需在控制器中创建一个新域,然后在该域内运行控制器方法即可 .

    基于express的Sailsjs可以使用连接中间件,您可以从中间件无缝地创建新域 . 有express-domain-middleware之类的东西 . 这可能是最美观的选择,也是最方便的选择 .

    Update: As mention by Benjamin Gruenbaum, Domains are planned to become deprecated in v1 of node. 也许你应该通读Joyents Error Handling Best Practices . 它与您正在使用的框架无关 .

    另外,你仍然可以使用域名,但是没有办法全局处理node.js中的错误 . 弃用后,您可以相对轻松地删除对域的依赖 . 也就是说,最好不要仅依靠域名 .

    Strongloop还提供了一个受名为Zone的域名启发的库 . 这也是一种选择 .

  • 4

    可以让节点实例由于编程错误而导致错误,否则它可能会继续处于不一致状态并导致业务逻辑陷入混乱 . 在 生产环境 环境中,服务器可以在崩溃时重新启动,如果错误不频繁,这将重置其状态并使其保持可用 . 在所有这些中,记录所有内容非常重要 . 这适用于大多数节点设置,包括SailsJS .

    可以采取以下方法:

    • 使用 Logger :服务器组件应该可以访问专用 Logger . 应该连接到一个服务,通知开发人员(电子邮件?)非常严重的错误 .

    • 将每个请求的错误传播到最后:小心转发请求处理中任何步骤的错误 . 在ExperssJs / ConnectJs /基于中间件的设置中, next(err) 可用于将错误传递给中间件链 . 链末尾的错误捕获中间件将收到此错误,将其记录为详细,并返回500状态 . 您可以使用 DomainsZonesPromisesasync 或任何您喜欢的方式处理请求并捕获错误 .

    • 关闭 process.on('uncaughtexception') :记录erorr,进行必要的清理,并再次向关机进程抛出相同的错误 .

    • Linux上的用户PM2 / Forever或Upstart / init.d:现在当进程由于异常异常而关闭时,这些工具将重新启动它并跟踪服务器崩溃的时间 . 如果服务器崩溃太多时间,那么停止它并立即采取行动是很好的 .

  • 0

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

    就个人而言,我通过bluebird库使用promises,并将一个将所有错误传递给全局错误处理函数的catch语句 .

相关问题