安装Node以后,让咱们尝试构建咱们的第一个Web服务器,建立名为“app.js”的文件,并粘贴如下代码:html
const http = require('http'); const hostname = '127.0.0.1'; const port = 3000; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World\n'); }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); });
以后,使用node app.js
运行你的Web服务器,访问http://localhost:3000,你将看到一条消息'Hello World'
。node
本指南将帮助你入门调试Node.js应用程序和脚本。git
当使用--inspect
开关启动时,Node.js进程经过WebSockets监听Inspector Protocol定义的诊断命令,默认状况下主机和端口127.0.0.1:9229
,还为每一个进程分配了惟一的UUID(例如,0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e
)。github
Inspector客户端必须知道并指定要链接到WebSocket接口的主机地址、端口和UUID,完整的URL是ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e
,固然取决于实际的主机和端口以及实例的正确UUID。web
Inspector还包括一个HTTP端点,用于提供有关调试对象的元数据,包括其WebSocket URL,UUID和Chrome DevTools URL,经过向http://[host:port]/json/list
发送HTTP请求来获取此元数据,这将返回一个JSON对象,以下所示;使用webSocketDebuggerUrl
属性做为URL直接链接到Inspector。chrome
{ "description": "node.js instance", "devtoolsFrontendUrl": "chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e", "faviconUrl": "https://nodejs.org/static/favicon.ico", "id": "0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e", "title": "node", "type": "node", "url": "file://", "webSocketDebuggerUrl": "ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e" }
在没有--inspect
的状况下启动的Node.js进程也能够经过SIGUSR1
(在Linux和OS X上)发出信号来指示开始侦听调试消息,从Node 7开始,这将激活旧版Debugger API,在Node 8及更高版本中,它将激活Inspector API。npm
因为调试器具备对Node.js执行环境的彻底访问权限,所以可以链接到此端口的恶意行为者能够表明Node进程执行任意代码,了解在公共和专用网络上公开调试器端口的安全隐患很是重要。json
若是调试器绑定到公共IP地址或0.0.0.0
,则任何能够访问你的IP地址的客户端均可以无限制地链接到调试器,而且可以运行任意代码。segmentfault
默认状况下,node --inspect
绑定到127.0.0.1
,若是你打算容许外部链接到调试器,你须要明确提供公共IP地址或0.0.0.0
等。这样作可能会给你带来潜在的重大安全威胁,咱们建议你确保适当的防火墙和访问控制措施,以防止安全风险。api
有关如何安全地容许远程调试器客户端链接的一些建议,请参阅“启用远程调试方案”一节。
即便将inspector端口绑定到127.0.0.1
(默认值),计算机上本地运行的任何应用程序也将具备不受限制的访问权限,这是为了让本地调试器可以方便地链接。
在Web浏览器中打开的网站能够在浏览器安全模型下进行WebSocket和HTTP请求,须要初始HTTP链接才能得到惟一的调试器会话ID,同源策略阻止网站创建此HTTP链接,为了防止DNS从新绑定攻击的其余安全性,Node.js会验证链接的“主机”标头是否精确指定了IP地址或localhost
或localhost6
。
这些安全策略不容许经过指定主机名来链接到远程调试服务器,你能够经过指定IP地址或使用ssh隧道来解决此限制,以下所述。
一些商业和开源工具能够链接到Node的Inspector,这些基本信息以下:
node inspect myscript.js
一块儿使用。npm install -g node-inspect
),并与node-inspect myscript.js
一块儿使用。Chrome DevTools 55+
chrome://inspect
,点击配置按钮,确保列出目标主机和端口。/json/list
的输出(见上文)或--inspect
提示文本复制devtoolsFrontendUrl
并粘贴到Chrome中。Visual Studio Code 1.10+
.vscode/launch.json
,选择“Node.js”进行初始设置。Visual Studio 2017
F5
。JetBrains WebStorm 2017.1+和其余JetBrains IDE
--inspect
,要禁用,请在IDE Registry中取消选中js.debugger.node.use.inspect
。下表列出了各类运行时标志对调试的影响:
--inspect
--inspect=[host:port]
host
(默认值:127.0.0.1)port
(127.0.0.1:9229)--inspect-brk
--inspect-brk=[host:port]
host
(默认值:127.0.0.1)port
(127.0.0.1:9229)node inspect script.js
--inspect
标志下运行用户脚本,并使用main进程运行CLI调试器。node inspect --port=xxxx script.js
--inspect
标志下运行用户脚本,并使用main进程运行CLI调试器。port
(127.0.0.1:9229)咱们建议你永远不要让调试器在公共IP地址上监听,若是你须要容许远程调试链接,咱们建议使用ssh隧道,咱们提供如下示例仅用于说明目的,请在继续操做以前了解容许远程访问特权服务的安全风险。
假设你在远程计算机remote.example.com
上运行Node,你但愿可以进行调试,在该计算机上,你应该启动node进程,而且inspector仅侦听localhost
(默认值)。
$ node --inspect server.js
如今,在要从中启动调试客户端链接的本地计算机上,能够设置ssh隧道:
$ ssh -L 9221:localhost:9229 user@remote.example.com
这将启动ssh
隧道会话,其中与本地计算机上的端口9221
的链接将转发到remote.example.com
上的端口9229
,你如今能够将调试器(如Chrome DevTools或Visual Studio Code)附加到localhost:9221
,它应该可以调试,就好像Node.js应用程序在本地运行同样。
从Node 7.7.0开始,遗留调试器已被弃用,请改用--inspect
和Inspector。
在版本7及更早版本中使用--debug
或--debug-brk
开关启动时,Node.js将侦听TCP端口上已停用的V8调试协议定义的调试命令,默认状况下为5858
,任何使用这个协议的调试器客户端均可以链接并调试正在运行的进程;下面列出了几个受欢迎的。
再也不维护或记录V8调试协议。
node debug script_name.js
以在Node的内置命令行调试器下启动脚本,你的脚本在另外一个使用--debug-brk
选项启动的Node进程中启动,初始Node进程运行_debugger.js
脚本并链接到你的目标。