作者:JuliánDuque应对各种挑战。Node.js的异步工作流为这个令人生畏的过程增加了额外的复杂性。虽然V8引擎做了一些更新以方便访问异步堆栈跟踪,但很多情况下我们只会在程序的主线程上遇到错误,这使得调试有些困难。同样,当我们的Node.js程序崩溃时,我们经常需要依赖一些复杂的CLI工具来分析核心转储。在本文中,我们将介绍一些调试Node.js程序的简单方法。日志记录当然,没有不提供日志记录的开发工具包。在本地开发中,我们倾向于将console.log语句放在整个代码中,但这并不是真正可扩展的生产策略。您可能需要进行一些过滤和清理,或实施一致的日志记录策略,以识别重要信息。要实施正确的面向日志的调试策略,可以使用日志记录工具,例如Pino或Winston。这些将允许您设置日志级别(信息、警告、错误),它们允许您在本地打印详细的日志消息,而在生产中仅打印严重的日志消息。您还可以将这些日志流式传输到聚合器或其他地方,例如LogStash、Papertrail甚至Slack。使用NodeInspect和ChromeDevTools日志记录只能让我们了解为什么程序没有按预期运行。对于复杂的调试,我们需要使用断点来检查代码在执行时的行为方式。为此,可以使用节点检查。NodeInspect是Node.js附带的调试工具。它实际上只是该程序的ChromeDevTools的一个实现,可让您添加断点、控制步进、查看变量和跟踪调用堆栈。有两种启动NodeInspect的方法,但可能最简单的是使用--inspect-brk标志调用Node.js应用程序:$node--inspect-brk$your_script_namebrowser://inspectURL进入ChromeDevTools。使用ChromeDevTools,您拥有在浏览器中调试JavaScript所需的全部功能。最有用的功能是检查内存的能力。您可以拍摄堆快照和分析内存使用情况,以查看内存是如何分配的,它可能在哪里以及内存泄漏在哪里。使用受支持的IDE许多现代IDE不仅能够以某种方式启动程序,而且还支持调试Node程序。除了ChromeDevTools中的许多功能外,它们还具有自己的功能,例如创建日志点和允许您创建多个调试配置文件的能力。您可以通过查阅检查器客户端上的Node.js指南来获取有关这些IDE的更多信息。使用NDB的另一种选择是安装ndb,它是Node.js的独立调试器,类似于浏览器中的DevTools,就像一个独立的本地调试器。它还具有DevTools中不可用的一些额外功能。它支持本地编辑,这意味着您可以修改代码并获得调试器平台直接支持的更新逻辑。这对于进行快速迭代非常有用。w事后调试假设您的程序由于灾难性错误(例如内存访问错误)而崩溃。这些可能很少见,但确实会发生,尤其是当您的应用程序依赖本机代码时。要调查此类问题,您可以使用llnode。当程序崩溃时,llnode可以通过将它们映射到C/C++端的对象来检查JavaScript堆栈帧和对象。为了使用它,您首先需要程序的核心转储。为此,您需要使用process.abort而不是process.exit来关闭代码中的进程。当您使用process.abort时,Node进程在退出时会生成一个核心转储文件。为了更好地了解llnode可以提供什么,该视频演示了它的一些功能。有用的Node模块除了上述所有内容之外,还建议使用第三方包进行进一步调试。debug第一个简称为debug。通过调试,您可以根据函数名称或整个模块分配特定的命名空间来记录消息。然后可以通过特定的环境变量选择将哪些消息打印到控制台。例如,这是一个Node.js服务器,它记录了来自整个程序和中间件堆栈的几条消息,例如sequelize、express:application和express:router:如果我们将DEBUG环境变量设置为express:router并启动相同的程序,仅显示标记为express:router的消息:通过以这种方式过滤消息,可以深入了解程序的单个部分的行为方式,而无需彻底更改代码的日志记录。trace与clarifytrace和clarifyify模块配合使用效果最佳。trace通过提供有关被调用的异步方法的更多详细信息来扩展您的异步堆栈跟踪,这是Node.js默认不提供的路线图。澄清有助于从特定于Node.js内部的堆栈跟踪中删除所有信息。这使您可以只关注程序的函数调用。这些模块不建议在生产环境中运行!只有在本地开发环境中调试时才应启用它们。
