Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在SailsJS中处理异常的最佳实践_Node.js_Exception Handling_Sails.js - Fatal编程技术网

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

Node.js 在SailsJS中处理异常的最佳实践,node.js,exception-handling,sails.js,Node.js,Exception Handling,Sails.js,几天前,我刚开始尝试帆船。 我意识到,每当出现未捕获的异常时,节点就会终止。 我有一个控制器列表,每个控制器在services/ 我可以为所有服务编写一个全局错误处理程序吗?这样,这些服务中发生的任何类型的错误都应该由它来处理,并且必须将适当的错误响应传递给前端 我尝试使用process.on('uncaughtexception')或一些基本异常,但需要将其添加到每个服务方法中 对于从客户端到服务器的所有服务调用,我也可以有一个共同点,所有io.socket.post()和io..socket

几天前,我刚开始尝试帆船。
我意识到,每当出现未捕获的异常时,节点就会终止。
我有一个控制器列表,每个控制器在services/
我可以为所有服务编写一个全局错误处理程序吗?这样,这些服务中发生的任何类型的错误都应该由它来处理,并且必须将适当的错误响应传递给前端

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

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

如果有任何文章能向我展示在SailsJS中处理未捕获异常的常见最佳实践,以及在所有服务中使用较短的代码而不是编写冗余代码,我将不胜感激。

最佳实践正在您的控制器中使用。这将处理异步代码中的异常,并且其相对简单

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

Sailsjs基于express,您可以使用connect中间件,并且可以从中间件无缝地创建一个新域。有这样的事。这可能是最美观、最方便的选择

更新: 正如Benjamin Grunbaum所提到的,域计划在node的v1中被弃用。也许您应该通读一遍。它与您正在使用的框架无关

另外,您仍然可以使用域,而在node.js中没有全局处理错误的方法。一旦被弃用,您总是可以相对容易地消除对域的依赖。也就是说,最好不要仅仅依赖于域


Strongloop还提供了一个由名为。这也是一个选项。

我没有尝试过,但我相信您应该能够使用
process.on('uncaughtexception')
在bootstrap.js中设置一个捕获所有异常处理程序


就我个人而言,我通过库使用Promissions,并放置一个catch语句,将所有错误传递给全局错误处理函数。

允许节点实例因编程错误而出错,否则它可能会继续处于不一致的状态并扰乱业务逻辑。在生产环境中,服务器可以在崩溃时重新启动,这将重置其状态,并在错误不频繁时保持可用状态。在所有这些方面,记录一切都非常重要。这适用于大多数节点设置,包括SAILSJ

可以采取以下方法:

  • 使用记录器:服务器组件应该可以访问专用记录器。应连接到通知开发人员(电子邮件?)非常严重错误的服务
  • 将每个请求的错误传播到底:小心地转发来自请求处理中任何步骤的错误。在基于ExperssJs/ConnectJs/middle-ware的设置中,可以使用
    next(err)
    将错误传递给中间件链。在链的末尾捕获中间件时出错,将获取此错误,详细记录它,并返回500状态。您可以使用
    区域
    承诺
    异步
    或任何您喜欢的方法来处理请求并捕获错误
  • 关闭
    进程。关闭('uncaughtexception')
    :记录erorr,进行必要的清理,然后再次向关闭进程抛出相同的错误
  • linux上的用户PM2/Forever或Upstart/init.d:现在,当进程由于坏异常而关闭时,这些工具将重新启动进程并跟踪服务器崩溃的时间。如果服务器崩溃的次数太多,最好停止它并立即采取行动

  • 真是个好问题。以前从未考虑过这一点,但策略是在调用控制器操作之前执行的代码。您可能希望尝试使用策略将控制器逻辑包装在try-catch块中,并将该策略作为默认策略应用于所有控制器操作。我没有试过这个,只是一个随机的想法掠过我的脑海。让我知道它是否有效。稍后我可能会尝试一下。这还不是一个真正的答案,但请注意——除其他外,它解决了nodejs中的错误处理问题。域在不久的将来可能会被弃用。定义“不久的将来”,v0.11甚至没有一个固定的发布日期,而且v0.12至少还要一年才能出现,这是乐观的。AFAIK v1甚至还没有开发出来,到目前为止只是一个想法。它甚至提到,为了保持向后兼容性,域可能会被移动到一个包(核心之外)。如果您像建议的那样使用中间件,那么您将很容易地替换异常处理。不久的将来大约是一个月。Node最近被分叉到io.js中,并且大多数核心贡献者已经迁移(因为发布周期)。我说不推荐的没有删除。我更新了我的答案以反映你的批评。我相信域名仍然是一种选择,因为我们可能不会看到域名在一段时间内被弃用,因为您提到的原因,它们可能不是“最佳实践”。也就是说,很难为处理异常提供“适合所有人”的最佳实践。我建议您将答案中提供的《Joyents指南》作为一个很好的指南,以了解如何开发允许异常的应用程序。我不是反对,但这是一个非常糟糕的做法,因为您的应用程序在某处发出未经处理的异常。这是一种惰性错误处理,任何时候向任何人建议这一点时,您都必须附带一个事实,即进程应该停止、重新启动并重新启动