安裝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
腳本並鏈接到你的目標。