摘要:調(diào)試指南本指南將幫助你入門調(diào)試應(yīng)用程序和腳本。這樣做可能會(huì)給你帶來潛在的重大安全威脅,我們建議你確保適當(dāng)?shù)姆阑饓驮L問控制措施,以防止安全風(fēng)險(xiǎn)。不再維護(hù)或記錄調(diào)試協(xié)議。
入門指南
安裝Node之后,讓我們嘗試構(gòu)建我們的第一個(gè)Web服務(wù)器,創(chuàng)建名為“app.js”的文件,并粘貼以下代碼:
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 "); }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); });
之后,使用node app.js運(yùn)行你的Web服務(wù)器,訪問http://localhost:3000,你將看到一條消息"Hello World"。
調(diào)試指南本指南將幫助你入門調(diào)試Node.js應(yīng)用程序和腳本。
啟用Inspector當(dāng)使用--inspect開關(guān)啟動(dòng)時(shí),Node.js進(jìn)程通過WebSockets監(jiān)聽I(yíng)nspector Protocol定義的診斷命令,默認(rèn)情況下主機(jī)和端口127.0.0.1:9229,還為每個(gè)進(jìn)程分配了唯一的UUID(例如,0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e)。
Inspector客戶端必須知道并指定要連接到WebSocket接口的主機(jī)地址、端口和UUID,完整的URL是ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e,當(dāng)然取決于實(shí)際的主機(jī)和端口以及實(shí)例的正確UUID。
Inspector還包括一個(gè)HTTP端點(diǎn),用于提供有關(guān)調(diào)試對(duì)象的元數(shù)據(jù),包括其WebSocket URL,UUID和Chrome DevTools URL,通過向http://[host:port]/json/list發(fā)送HTTP請(qǐng)求來獲取此元數(shù)據(jù),這將返回一個(gè)JSON對(duì)象,如下所示;使用webSocketDebuggerUrl屬性作為URL直接連接到Inspector。
{ "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的情況下啟動(dòng)的Node.js進(jìn)程也可以通過SIGUSR1(在Linux和OS X上)發(fā)出信號(hào)來指示開始偵聽調(diào)試消息,從Node 7開始,這將激活舊版Debugger API,在Node 8及更高版本中,它將激活I(lǐng)nspector API。
安全影響由于調(diào)試器具有對(duì)Node.js執(zhí)行環(huán)境的完全訪問權(quán)限,因此能夠連接到此端口的惡意行為者可以代表Node進(jìn)程執(zhí)行任意代碼,了解在公共和專用網(wǎng)絡(luò)上公開調(diào)試器端口的安全隱患非常重要。
公開公共調(diào)試端口是不安全的如果調(diào)試器綁定到公共IP地址或0.0.0.0,則任何可以訪問你的IP地址的客戶端都可以無限制地連接到調(diào)試器,并且能夠運(yùn)行任意代碼。
默認(rèn)情況下,node --inspect綁定到127.0.0.1,如果你打算允許外部連接到調(diào)試器,你需要明確提供公共IP地址或0.0.0.0等。這樣做可能會(huì)給你帶來潛在的重大安全威脅,我們建議你確保適當(dāng)?shù)姆阑饓驮L問控制措施,以防止安全風(fēng)險(xiǎn)。
有關(guān)如何安全地允許遠(yuǎn)程調(diào)試器客戶端連接的一些建議,請(qǐng)參閱“啟用遠(yuǎn)程調(diào)試方案”一節(jié)。
本地應(yīng)用程序可以完全訪問inspector即使將inspector端口綁定到127.0.0.1(默認(rèn)值),計(jì)算機(jī)上本地運(yùn)行的任何應(yīng)用程序也將具有不受限制的訪問權(quán)限,這是為了讓本地調(diào)試器能夠方便地連接。
瀏覽器、WebSockets和同源策略在Web瀏覽器中打開的網(wǎng)站可以在瀏覽器安全模型下進(jìn)行WebSocket和HTTP請(qǐng)求,需要初始HTTP連接才能獲得唯一的調(diào)試器會(huì)話ID,同源策略阻止網(wǎng)站建立此HTTP連接,為了防止DNS重新綁定攻擊的其他安全性,Node.js會(huì)驗(yàn)證連接的“主機(jī)”標(biāo)頭是否精確指定了IP地址或localhost或localhost6。
這些安全策略不允許通過指定主機(jī)名來連接到遠(yuǎn)程調(diào)試服務(wù)器,你可以通過指定IP地址或使用ssh隧道來解決此限制,如下所述。
Inspector客戶端一些商業(yè)和開源工具可以連接到Node的Inspector,這些基本信息如下:
node-inspect
Node.js Foundation支持的CLI調(diào)試器,它使用Inspector協(xié)議。
一個(gè)與Node捆綁在一起的版本,可以與node inspect myscript.js一起使用。
最新版本也可以獨(dú)立安裝(例如npm install -g node-inspect),并與node-inspect myscript.js一起使用。
Chrome DevTools 55+
選項(xiàng)1:在基于Chromium的瀏覽器中打開chrome://inspect,點(diǎn)擊配置按鈕,確保列出目標(biāo)主機(jī)和端口。
選項(xiàng)2:從/json/list的輸出(見上文)或--inspect提示文本復(fù)制devtoolsFrontendUrl并粘貼到Chrome中。
選項(xiàng)3:安裝Chrome擴(kuò)展程序NIM(Node Inspector Manager):https://chrome.google.com/webstore/detail/nim-node-inspector-manage/gnhhdgbaldcilmgcpfddgdbkhjohddkj。
Visual Studio Code 1.10+
在Debug面板中,點(diǎn)擊設(shè)置圖標(biāo)以打開.vscode/launch.json,選擇“Node.js”進(jìn)行初始設(shè)置。
Visual Studio 2017
從菜單中選擇“Debug> Start Debugging”或按F5。
詳細(xì)說明。
JetBrains WebStorm 2017.1+和其他JetBrains IDE
創(chuàng)建一個(gè)新的Node.js調(diào)試配置并點(diǎn)擊Debug,對(duì)于Node.js 7+,默認(rèn)情況下將使用--inspect,要禁用,請(qǐng)?jiān)贗DE Registry中取消選中js.debugger.node.use.inspect。
chrome-remote-interface
用于簡(jiǎn)化與Inspector Protocol端點(diǎn)的連接的庫(kù)。
命令行選項(xiàng)下表列出了各種運(yùn)行時(shí)標(biāo)志對(duì)調(diào)試的影響:
--inspect
啟用inspector代理
監(jiān)聽默認(rèn)地址和端口(127.0.0.1:9229)
--inspect=[host:port]
啟用inspector代理
綁定到地址或主機(jī)名,host(默認(rèn)值:127.0.0.1)
監(jiān)聽端口,port(127.0.0.1:9229)
--inspect-brk
啟用inspector代理
監(jiān)聽默認(rèn)地址和端口(127.0.0.1:9229)
在用戶代碼啟動(dòng)前中斷
--inspect-brk=[host:port]
啟用inspector代理
綁定到地址或主機(jī)名,host(默認(rèn)值:127.0.0.1)
監(jiān)聽端口,port(127.0.0.1:9229)
在用戶代碼啟動(dòng)前中斷
node inspect script.js
生成子進(jìn)程以在--inspect標(biāo)志下運(yùn)行用戶腳本,并使用main進(jìn)程運(yùn)行CLI調(diào)試器。
node inspect --port=xxxx script.js
生成子進(jìn)程以在--inspect標(biāo)志下運(yùn)行用戶腳本,并使用main進(jìn)程運(yùn)行CLI調(diào)試器。
監(jiān)聽端口,port(127.0.0.1:9229)
啟用遠(yuǎn)程調(diào)試方案我們建議你永遠(yuǎn)不要讓調(diào)試器在公共IP地址上監(jiān)聽,如果你需要允許遠(yuǎn)程調(diào)試連接,我們建議使用ssh隧道,我們提供以下示例僅用于說明目的,請(qǐng)?jiān)诶^續(xù)操作之前了解允許遠(yuǎn)程訪問特權(quán)服務(wù)的安全風(fēng)險(xiǎn)。
假設(shè)你在遠(yuǎn)程計(jì)算機(jī)remote.example.com上運(yùn)行Node,你希望能夠進(jìn)行調(diào)試,在該計(jì)算機(jī)上,你應(yīng)該啟動(dòng)node進(jìn)程,并且inspector僅偵聽localhost(默認(rèn)值)。
$ node --inspect server.js
現(xiàn)在,在要從中啟動(dòng)調(diào)試客戶端連接的本地計(jì)算機(jī)上,可以設(shè)置ssh隧道:
$ ssh -L 9221:localhost:9229 [email protected]
這將啟動(dòng)ssh隧道會(huì)話,其中與本地計(jì)算機(jī)上的端口9221的連接將轉(zhuǎn)發(fā)到remote.example.com上的端口9229,你現(xiàn)在可以將調(diào)試器(如Chrome DevTools或Visual Studio Code)附加到localhost:9221,它應(yīng)該能夠調(diào)試,就好像Node.js應(yīng)用程序在本地運(yùn)行一樣。
遺留調(diào)試器從Node 7.7.0開始,遺留調(diào)試器已被棄用,請(qǐng)改用--inspect和Inspector。
在版本7及更早版本中使用--debug或--debug-brk開關(guān)啟動(dòng)時(shí),Node.js將偵聽TCP端口上已停用的V8調(diào)試協(xié)議定義的調(diào)試命令,默認(rèn)情況下為5858,任何使用這個(gè)協(xié)議的調(diào)試器客戶端都可以連接并調(diào)試正在運(yùn)行的進(jìn)程;下面列出了幾個(gè)受歡迎的。
不再維護(hù)或記錄V8調(diào)試協(xié)議。
內(nèi)置調(diào)試器
啟動(dòng)node debug script_name.js以在Node的內(nèi)置命令行調(diào)試器下啟動(dòng)腳本,你的腳本在另一個(gè)使用--debug-brk選項(xiàng)啟動(dòng)的Node進(jìn)程中啟動(dòng),初始Node進(jìn)程運(yùn)行_debugger.js腳本并連接到你的目標(biāo)。
node-inspector
使用Chrome DevTools調(diào)試Node.js應(yīng)用程序,使用中間進(jìn)程將Chromium中使用的Inspector協(xié)議轉(zhuǎn)換為Node.js中使用的V8 Debugger協(xié)議。
上一篇:關(guān)于Node.js 下一篇:輕松分析Node.js應(yīng)用程序文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99174.html
Node.js 指南 Node.js?是基于Chrome的V8 JavaScript引擎構(gòu)建的JavaScript運(yùn)行時(shí)。 常規(guī) 關(guān)于Node.js 入門指南 輕松分析Node.js應(yīng)用程序 Docker化Node.js Web應(yīng)用程序 遷移到安全的Buffer構(gòu)造函數(shù) Node.js核心概念 阻塞與非阻塞概述 Node.js事件循環(huán)、定時(shí)器和process.nextTick() 不要阻塞事...
摘要:如果不熟悉這種語言,有一篇關(guān)于阻塞與非阻塞的完整文章。在設(shè)計(jì)上與的或的等系統(tǒng)類似,并受其影響,進(jìn)一步采用事件模型。它將事件循環(huán)呈現(xiàn)為運(yùn)行時(shí)構(gòu)造而不是庫(kù),在其他系統(tǒng)中,始終存在阻塞調(diào)用以啟動(dòng)事件循環(huán)。上一篇指南目錄下一篇入門指南 關(guān)于Node.js 作為異步事件驅(qū)動(dòng)的JavaScript運(yùn)行時(shí),Node旨在構(gòu)建可伸縮的網(wǎng)絡(luò)應(yīng)用程序,在下面的hello world示例中,可以同時(shí)處理許多連...
摘要:化應(yīng)用程序此示例的目的是向你展示如何將應(yīng)用程序放入容器中,該指南旨在用于開發(fā),而不用于生產(chǎn)部署,本指南還假設(shè)你有一個(gè)有效的安裝,并且基本了解應(yīng)用程序的結(jié)構(gòu)。 Docker化Node.js Web應(yīng)用程序 此示例的目的是向你展示如何將Node.js應(yīng)用程序放入Docker容器中,該指南旨在用于開發(fā),而不用于生產(chǎn)部署,本指南還假設(shè)你有一個(gè)有效的Docker安裝,并且基本了解Node.js應(yīng)...
摘要:中的定時(shí)器中的模塊包含在一段時(shí)間后執(zhí)行代碼的函數(shù),定時(shí)器不需要通過導(dǎo)入,因?yàn)樗蟹椒ǘ伎梢栽谌址秶鷥?nèi)模擬瀏覽器,要完全了解何時(shí)執(zhí)行定時(shí)器功能,最好先閱讀事件循環(huán)。 Node.js中的定時(shí)器 Node.js中的Timers模塊包含在一段時(shí)間后執(zhí)行代碼的函數(shù),定時(shí)器不需要通過require()導(dǎo)入,因?yàn)樗蟹椒ǘ伎梢栽谌址秶鷥?nèi)模擬瀏覽器JavaScript API,要完全了解何時(shí)執(zhí)行定...
摘要:特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請(qǐng)斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會(huì)及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會(huì)不定期更...
閱讀 2037·2021-09-13 10:23
閱讀 2375·2021-09-02 09:47
閱讀 3831·2021-08-16 11:01
閱讀 1252·2021-07-25 21:37
閱讀 1630·2019-08-30 15:56
閱讀 561·2019-08-30 13:52
閱讀 3154·2019-08-26 10:17
閱讀 2470·2019-08-23 18:17