如何調(diào)試nodejs程序?下面本篇文章給大家介紹一下nodejs調(diào)試debug的方法,希望對(duì)大家有所幫助!
對(duì)于開(kāi)發(fā)者來(lái)說(shuō),在開(kāi)發(fā)應(yīng)用程序的過(guò)程中,往往為了開(kāi)發(fā)方便和解決bug需要借助于編程語(yǔ)言的調(diào)試功能。一般來(lái)說(shuō)我們需要借助于強(qiáng)大IDE的調(diào)試功能來(lái)完成這項(xiàng)工作。nodejs也不例外。
今天我們來(lái)詳細(xì)介紹一下如何調(diào)試node程序。
開(kāi)啟nodejs的調(diào)試
還記得之前我們講到的koa程序嗎?本文將會(huì)以一個(gè)簡(jiǎn)單的koa服務(wù)端程序?yàn)槔?,?lái)展開(kāi)nodejs的調(diào)試。
先看下一個(gè)簡(jiǎn)單的koa服務(wù)app.js:
const Koa = require('koa'); const app = module.exports = new Koa(); app.use(async function(ctx) { ctx.body = 'Hello World'; }); if (!module.parent) app.listen(3000);
上面的程序開(kāi)啟了3000端口,建立了一個(gè)http服務(wù)。每次請(qǐng)求的時(shí)候,都會(huì)返回hello World,非常的簡(jiǎn)單。
要想運(yùn)行上面的程序,我們需要執(zhí)行node app.js。 這會(huì)執(zhí)行app.js但是并不會(huì)開(kāi)啟調(diào)試功能。
怎么進(jìn)行調(diào)試呢?
我們需要加上 –inspect 參數(shù):
node --inspect app.js
上面的代碼將會(huì)開(kāi)啟nodejs的調(diào)試功能。
我們看下輸出結(jié)果:
Debugger listening on ws://127.0.0.1:9229/88c23ae3-9081-41cd-98b0-d0f7ebceab5a For help, see: https://nodejs.org/en/docs/inspector
結(jié)果告訴了我們兩件事情,第一件事情就是debugger監(jiān)聽(tīng)的端口。默認(rèn)情況下將會(huì)開(kāi)啟127.0.0.1的9229端口。并且分配了一個(gè)唯一的UUID以供區(qū)分。
第二件事情就是告訴我們nodejs使用的調(diào)試器是Inspector。
Inspector是nodejs 8之后引入的,如果是在nodejs 7之前,那么使用的是legacy debugger。
調(diào)試的安全性
如果debugger連接到了nodejs運(yùn)行環(huán)境中,如果有惡意攻擊者的話,這個(gè)惡意攻擊者可以在nodejs環(huán)境中運(yùn)行任意代碼。這會(huì)給我們的程序帶來(lái)很大的安全隱患。
所以我們一定要注意調(diào)試的安全性。一般來(lái)說(shuō),我們不建議進(jìn)行遠(yuǎn)程調(diào)試。
默認(rèn)情況下 –inspect 綁定的是127.0.0.1,這樣就只允許本地程序訪問(wèn)。并且任何本地運(yùn)行的程序都有權(quán)限進(jìn)行該程序的調(diào)試。
如果我們真的想將debug程序暴露給外部程序的話,那么可以指明本機(jī)的外網(wǎng)IP地址或者0.0.0.0(表示任何地址,無(wú)限制),這樣遠(yuǎn)程機(jī)子就可以進(jìn)行遠(yuǎn)程調(diào)試了。
如果我們想進(jìn)行安全的remote debug該怎么處理呢?
首先,我們要開(kāi)啟本地的debug:
node --inspect app.js
然后我們可以搭建一個(gè)ssh隧道,將本地的9221端口映射到遠(yuǎn)程服務(wù)器的9229端口:
ssh -L 9221:localhost:9229 user@remote.example.com
這樣我們就可以通過(guò)連接本地的9221端口,進(jìn)行遠(yuǎn)程調(diào)試了。
使用WebStorm進(jìn)行nodejs調(diào)試
JetBrains出品的WebStorm可謂是開(kāi)發(fā)nodejs的利器,WebStorm自帶有debug選項(xiàng),如果開(kāi)啟該選項(xiàng),則會(huì)在后臺(tái)開(kāi)啟 –inspect:
使用WebStorm來(lái)進(jìn)行調(diào)試和使用IDEA來(lái)進(jìn)行java程序調(diào)試類(lèi)似,這里就不多介紹了。
使用Chrome devTools進(jìn)行調(diào)試
使用Chrome devTools進(jìn)行調(diào)試的前提是我們已經(jīng)開(kāi)啟了 –inspect模式。
在chrome中輸入chrome://inspect:
我們可看到chrome inspect的界面,如果你本地已經(jīng)有開(kāi)啟inspect的nodejs程序的話,在Remote Target中就可以直接看到。
選中你要調(diào)試的target,點(diǎn)擊inspect,即可開(kāi)啟Chrome devTools調(diào)試工具:
你可以對(duì)程序進(jìn)行profile,也可以進(jìn)行調(diào)試。
這里我們關(guān)注的是調(diào)試,所以轉(zhuǎn)到source一欄,添加你要調(diào)試的程序的源代碼:
加入斷點(diǎn)即可開(kāi)始調(diào)試了。和在chrome中調(diào)試web端的js是一樣的。
使用node-inspect來(lái)進(jìn)行調(diào)試
其實(shí)nodejs有一個(gè)自帶的調(diào)試工具,叫做node-inspect,這是一個(gè)cli的調(diào)試工具。我們看一下怎么使用。
我們直接使用:
node inspect app.js < Debugger listening on ws://127.0.0.1:9229/f1c64736-47a1-42c9-9e9e-f2665073d3eb < For help, see: https://nodejs.org/en/docs/inspector < Debugger attached. Break on start in app.js:1 > 1 const Koa = require('koa'); 2 const app = module.exports = new Koa(); 3 debug>
node inspect 做了兩件事情,第一件事情就是生成子程序去運(yùn)行node –inspect app.js,第二件事情就是在主程序中運(yùn)行CLI調(diào)試窗口。
這個(gè)CLI調(diào)試程序?yàn)槲覀兲峁┝艘恍┓浅S杏玫拿睿?/p>
1、Stepping
- cont, c: 繼續(xù)執(zhí)行
- next, n: Step到下一步
- step, s: Step in
- out, o: Step out
- pause: 暫停運(yùn)行的代碼
2、Breakpoints
- setBreakpoint(), sb(): 在當(dāng)前行設(shè)置斷點(diǎn)
- setBreakpoint(line), sb(line): 在指定的行設(shè)置斷點(diǎn)
- setBreakpoint(‘fn()’), sb(…): 在指定的function中設(shè)置斷點(diǎn)
- setBreakpoint(‘script.js’, 1), sb(…): 在指定的腳本文件中設(shè)置斷點(diǎn)
- clearBreakpoint(‘script.js’, 1), cb(…): 從文件中清除斷點(diǎn)
3、Information
- backtrace, bt: 打印當(dāng)前execution frame的backtrace信息
- list(5): 列出源代碼前后的5行
- watch(expr): 添加監(jiān)聽(tīng)表達(dá)式
- unwatch(expr): 刪除監(jiān)聽(tīng)表達(dá)式
- watchers: 列出所有的watchers
- repl: 打開(kāi)repl表達(dá)式
- exec expr: 執(zhí)行表達(dá)式
通過(guò)上面的命令,我們可以在CLI中進(jìn)行比較復(fù)雜的調(diào)試活動(dòng)。
其他的debug客戶端
除了上面我們講到的幾個(gè)之外,我們還可以使用vscode,Visual Studio ,Eclipse IDE 等來(lái)進(jìn)行nodejs的調(diào)試,這里就不一一詳細(xì)介紹了。
感興趣的朋友可以自行探索。