一些调试 Node.js 程序的快速办法
在调试程序时总是会碰到各种挑衅。 Node.js 的异步工作流为这一艰难的历程增添了额外的复杂性。尽管 V8 引擎为了利便拜访异步栈跟踪停止了一些更新,但是在许多数状况下,我们只会在程序主线程上碰到错误,这使得调试有些艰难。一样,当我们的 Node.js 程序崩溃时,平常需要依托一些复杂的 CLI 工具来剖析中心转储。
在本文中,我们将介绍一些调试 Node.js 程序的简捷办法。【视频教程引荐:node js教程 】
日志记载
当然,没有哪一个开发工具箱是不供给日志的。我们倾向于在当地开发中的整个代码中放置 console.log
语句,但这并不是生产中真正可扩展的战略。你大概需要停止一些过滤和清算,或者实施一致的日志记载战略,以便从中识别出重要的信息。
要实施恰当的面向日志的调试战略,可以用 Pino或 Winston 之类的日志记载工具。这些将同意你设定日志级别(INFO
、 WARN
、ERROR
),它们同意你在当地打印具体的日志新闻,同时在生产环境下仅打印严峻的日志新闻。你还可以将这些日志流式传输到聚合器或其他地方,例如 LogStash,Papertrail 乃至 Slack。
使用 Node Inspect 和 Chrome DevTools
日志记载只能使我们理解程序为什么没法按预测运转。关于复杂的调试,我们将但愿使用断点来检查代码在施行时的行动。
为此,可以使用 Node Inspect。 Node Inspect 是 Node.js 附带的调试工具。它实际上只是程序的 Chrome DevTools 的实现,可让你增加断点、操纵分步施行、查看变量、并遵照调取堆栈。
有两种办法启动 Node Inspect,但最简便的办法大概就是使用 --inspect-brk
标记来调取 Node.js 利用程序:
$ node --inspect-brk $your_script_name
启动程序后,前往 Chrome 阅读器中的 chrome://inspect
URL 进入 Chrome DevTools。借助 Chrome DevTools,你可以具有在阅读器中调试 JavaScript 时的所有功效。最有用的功效是检查内存的能力。你可以猎取堆快照并配置内存使用状况,以理解内存的分配方式乃至大概的方式及内存走漏的状况。
使用受支撑的IDE
很多现代 IDE 不单能够以某种方式启动程序,并且还支撑调试 Node 程序。除了具有 Chrome DevTools 中的很多功效外,它们还具有本人的功效,例如可以创立日志点并同意你创立多个调试配置文件。可以通过查阅有关检查器客户端的 Node.js 指南来猎取有关这些 IDE 的更多信息。
使用NDB
另一种选中是安置 ndb,它是 Node.js 的独立调试器,和阅读器中的 DevTools 相似,就像一个隔离的当地调试器一样。它还有一些在 DevTools 中不成用的额外功效。它支撑当地编纂,这意味着你可以修改代码并得到调试器平台直接支撑的更新逻辑。这关于停止快速迭代非常有用。w
事后调试
假设你的程序由于劫难性错误(例如内存拜访错误)而崩溃。这些大概很少见,但确实会发生,特殊是假如你的利用程序依靠于本机代码。
要观察这类问题,可以使用 llnode。当程序崩溃时,llnode
可以通过将 JavaScript 堆栈框架和对象映射到 C/C++ 端的对象来检查它们。为了使用它,你第一需要程序的中心转储。为此你需要使用 process.abort
而不是process.exit
来关闭代码中的进程。当你使用 process.abort
时,Node 进程在退出时会生成一个中心转储文件。
为了更好地懂得 llnode
可以供给的功效,这个视频演示了其一些功效。
有用的 Node 模块
除了上述所有之外,还倡议用第三方软件包做进一步调试。
debug
第一个被简便地称为 debug。使用 debug,你可以基于函数名或整个模块为日志新闻分配特定的命名空间。然后可以通过特定的环境变量选中将哪些新闻打印到操纵台。
例如,这是一个 Node.js 效劳器,它正在记载来自整个程序和中心件栈的几条新闻,例如 sequelize
,express:application
和 express:router
:
假如我们将 DEBUG 环境变量设定为 express:router
并启动雷同的程序,则仅显示标志为 express:router
的新闻:
通过以这种方式过滤新闻,可以深入研讨程序单个部分的行动方式,而无需大幅度更换代码的日志记载。
trace 与 clarify
trace 和 clarify 两个模块最好在一起配合使用。
trace
通过供给有关被调取的异步办法的更多具体信息来扩展你的异步栈跟踪,这是 Node.js 默许不供给的道路图。 clarify
通过从特定于 Node.js 内部的栈跟踪中删除所有信息来供给帮忙。这使你可以专心于仅针对程序的函数调取。
这些模块都不倡议在生产环境中运转!仅在当地开发环境中停止调试时才应启用它们。