Skip to content

Node.js 调试

本指南将帮助您开始调试 Node.js 应用程序和脚本。

启用 Inspector

使用 --inspect 开关启动时,Node.js 进程会监听调试客户端。默认情况下,它将在主机和端口 127.0.0.1:9229 上监听。每个进程还会分配一个唯一的 UUID。

Inspector 客户端必须知道并指定主机地址、端口和 UUID 才能连接。完整的 URL 将类似于 ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e

如果 Node.js 接收 SIGUSR1 信号,它也会开始监听调试消息。(SIGUSR1 在 Windows 上不可用。)在 Node.js 7 及更早版本中,这会激活旧版 Debugger API。在 Node.js 8 及更高版本中,它将激活 Inspector API。

安全隐患

由于调试器可以完全访问 Node.js 执行环境,因此能够连接到此端口的恶意行为者可能会能够代表 Node.js 进程执行任意代码。了解在公共和私有网络上公开调试器端口的安全隐患非常重要。

公开调试端口是不安全的

如果调试器绑定到公共 IP 地址或 0.0.0.0,任何能够访问您的 IP 地址的客户端都能够无限制地连接到调试器,并能够运行任意代码。

默认情况下,node --inspect 绑定到 127.0.0.1。如果您打算允许外部客户端连接到调试器,则需要显式提供公共 IP 地址或 0.0.0.0 等。这样做可能会使您面临潜在的重大安全威胁。我们建议您确保已实施适当的防火墙和访问控制,以防止安全漏洞。

请参阅“启用远程调试场景”部分,了解有关如何安全地允许远程调试器客户端连接的一些建议。

本地应用程序拥有对检查器的完全访问权限

即使您将检查器端口绑定到 127.0.0.1(默认值),本地计算机上运行的任何应用程序都将拥有不受限制的访问权限。这是为了方便本地调试器连接而设计的。

浏览器、WebSockets 和同源策略

在浏览器中打开的网站可以在浏览器安全模型下发出 WebSocket 和 HTTP 请求。需要进行初始 HTTP 连接以获取唯一的调试器会话 ID。同源策略阻止网站建立此 HTTP 连接。为进一步防止DNS 重绑定攻击,Node.js 会验证连接的“Host”标头是否精确指定 IP 地址或localhost

这些安全策略不允许通过指定主机名连接到远程调试服务器。您可以通过指定 IP 地址或使用下面描述的 ssh 隧道来解决此限制。

Inspector 客户端

node inspect myscript.js 提供了一个最小的 CLI 调试器。几个商业和开源工具也可以连接到 Node.js Inspector。

Chrome DevTools 55+,Microsoft Edge

  • 选项 1: 在基于 Chromium 的浏览器中打开 chrome://inspect,或在 Edge 中打开 edge://inspect。单击“配置”按钮,并确保已列出目标主机和端口。
  • 选项 2: 从 /json/list 的输出(参见上文)或 --inspect 提示文本中复制 devtoolsFrontendUrl,并将其粘贴到 Chrome 中。

更多信息,请参见 https://github.com/ChromeDevTools/devtools-frontendhttps://www.microsoftedgeinsider.com

Visual Studio Code 1.10+

  • 在调试面板中,点击设置图标打开 .vscode/launch.json。选择“Node.js”进行初始设置。

参见 https://github.com/microsoft/vscode 获取更多信息。

JetBrains WebStorm 和其他 JetBrains IDE

  • 创建一个新的 Node.js 调试配置并点击调试。对于 Node.js 7+,默认情况下将使用 --inspect。要禁用它,请在 IDE 注册表中取消选中 js.debugger.node.use.inspect。要了解有关在 WebStorm 和其他 JetBrains IDE 中运行和调试 Node.js 的更多信息,请查看 WebStorm 在线帮助

chrome-remote-interface

Gitpod

  • 从“调试”视图启动 Node.js 调试配置或按 F5。详细说明

参见 https://www.gitpod.io 获取更多信息。

使用 Eclipse Wild Web Developer 插件的 Eclipse IDE

  • .js 文件中,选择 Debug As... > Node program,或者创建一个调试配置来附加调试器到正在运行的 Node.js 应用程序(已经使用 --inspect 启动)。

更多信息请参见 https://eclipse.org/eclipseide

命令行选项

下表列出了各种运行时标志对调试的影响:

标志含义
--inspect使用 Node.js Inspector 启用调试。监听默认地址和端口 (127.0.0.1:9229)
--inspect-brk使用 Node.js Inspector 启用调试。监听默认地址和端口 (127.0.0.1:9229);在用户代码启动前中断
--inspect=[host:port]启用 Inspector 代理;绑定到地址或主机名 host (默认: 127.0.0.1);监听端口 port (默认: 9229)
--inspect-brk=[host:port]启用 Inspector 代理;绑定到地址或主机名 host (默认: 127.0.0.1);监听端口 port (默认: 9229);在用户代码启动前中断
--inspect-wait启用 Inspector 代理;监听默认地址和端口 (127.0.0.1:9229);等待附加调试器。
--inspect-wait=[host:port]启用 Inspector 代理;绑定到地址或主机名 host (默认: 127.0.0.1);监听端口 port (默认: 9229);等待附加调试器。
node inspect script.js生成子进程以在 --inspect 标志下运行用户的脚本;并使用主进程运行 CLI 调试器。
node inspect --port=xxxx script.js生成子进程以在 --inspect 标志下运行用户的脚本;并使用主进程运行 CLI 调试器。监听端口 port (默认: 9229)

启用远程调试场景

我们建议您绝不要让调试器监听公共 IP 地址。如果您需要允许远程调试连接,我们建议使用 ssh 隧道。我们仅出于说明目的提供以下示例。在继续操作之前,请了解允许远程访问特权服务的安全风险。

假设您在远程计算机 remote.example.com 上运行 Node.js,并且您希望能够调试它。在该计算机上,您应该启动 Node.js 进程,并让检查器仅监听本地主机(默认设置)。

bash
node --inspect app.js

现在,在您要从中启动调试客户端连接的本地计算机上,您可以设置一个 ssh 隧道:

bash
ssh -L 9225:localhost:9229 remote.example.com

这将启动一个 ssh 隧道会话,其中本地机器上端口 9221 的连接将被转发到 remote.example.com 上的端口 9229。您现在可以将调试器(例如 Chrome DevTools 或 Visual Studio Code)附加到 localhost:9221,它应该能够像 Node.js 应用程序在本地运行一样进行调试。

遗留调试器

从 Node.js 7.7.0 版本开始,遗留调试器已弃用。请使用 --inspect 和 Inspector 代替。

在 7.0 及更早版本中,使用 --debug--debug-brk 开关启动时,Node.js 会侦听由已弃用的 V8 调试协议在 TCP 端口(默认为 5858)上定义的调试命令。任何使用此协议的调试器客户端都可以连接并调试正在运行的进程;下面列出了一些流行的调试器客户端。

V8 调试协议不再维护或记录。

内置调试器

启动 node debug script_name.js 以在内置命令行调试器下启动脚本。您的脚本在使用 --debug-brk 选项启动的另一个 Node.js 进程中启动,而初始 Node.js 进程运行 _debugger.js 脚本并连接到您的目标。更多信息请参见 文档

node-inspector

通过使用一个中间进程将 Chromium 中使用的 Inspector 协议 转换为 Node.js 中使用的 V8 调试器协议,使用 Chrome DevTools 调试您的 Node.js 应用程序。更多信息请参见 https://github.com/node-inspector/node-inspector