這篇文章給大家分享的是有關(guān)調(diào)試Node.js程序的方法是什么的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,公司以網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計、系統(tǒng)開發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶數(shù)千家,涉及國內(nèi)多個省份客戶。擁有多年網(wǎng)站建設(shè)開發(fā)經(jīng)驗。為企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計、宣傳推廣等服務(wù)。 通過專業(yè)的設(shè)計、獨特的風(fēng)格,為不同客戶提供各種風(fēng)格的特色服務(wù)。在調(diào)試程序時總是會遇到各種挑戰(zhàn)。 Node.js 的異步工作流為這一艱巨的過程增加了額外的復(fù)雜性。盡管 V8 引擎為了方便訪問異步棧跟蹤進行了一些更新,但是在很多數(shù)情況下,我們只會在程序主線程上遇到錯誤,這使得調(diào)試有些困難。同樣,當我們的 Node.js 程序崩潰時,通常需要依靠一些復(fù)雜的 CLI 工具來分析核心轉(zhuǎn)儲。
當然,沒有哪一個開發(fā)工具箱是不提供日志的。我們傾向于在本地開發(fā)中的整個代碼中放置 console.log
語句,但這并不是生產(chǎn)中真正可擴展的策略。你可能需要進行一些過濾和清理,或者實施一致的日志記錄策略,以便從中識別出重要的信息。
要實施適當?shù)拿嫦蛉罩镜恼{(diào)試策略,可以用 Pino或 Winston 之類的日志記錄工具。這些將允許你設(shè)置日志級別(INFO
、 WARN
、ERROR
),它們允許你在本地打印詳細的日志消息,同時在生產(chǎn)環(huán)境下僅打印嚴重的日志消息。你還可以將這些日志流式傳輸?shù)骄酆掀骰蚱渌胤剑?LogStash,Papertrail 甚至 Slack。
日志記錄只能使我們了解程序為何無法按預(yù)期運行。對于復(fù)雜的調(diào)試,我們將希望使用斷點來檢查代碼在執(zhí)行時的行為。
為此,可以使用 Node Inspect。 Node Inspect 是 Node.js 附帶的調(diào)試工具。它實際上只是程序的 Chrome DevTools 的實現(xiàn),可讓你添加斷點、控制分步執(zhí)行、查看變量、并遵循調(diào)用堆棧。
有兩種方法啟動 Node Inspect,但最簡單的方法可能就是使用 --inspect-brk
標志來調(diào)用 Node.js 應(yīng)用程序:
$ node --inspect-brk $your_script_name
啟動程序后,前往 Chrome 瀏覽器中的 chrome://inspect
URL 進入 Chrome DevTools。借助 Chrome DevTools,你可以擁有在瀏覽器中調(diào)試 JavaScript 時的所有功能。最有用的功能是檢查內(nèi)存的能力。你可以獲取堆快照并配置內(nèi)存使用情況,以了解內(nèi)存的分配方式以及可能的方式及內(nèi)存泄漏的情況。
許多現(xiàn)代 IDE 不但能夠以某種方式啟動程序,而且還支持調(diào)試 Node 程序。除了具有 Chrome DevTools 中的許多功能外,它們還具有自己的功能,例如可以創(chuàng)建日志點并允許你創(chuàng)建多個調(diào)試配置文件。可以通過查閱有關(guān)檢查器客戶端的 Node.js 指南來獲取有關(guān)這些 IDE 的更多信息。
另一種選擇是安裝 ndb,它是 Node.js 的獨立調(diào)試器,和瀏覽器中的 DevTools 類似,就像一個隔離的本地調(diào)試器一樣。它還有一些在 DevTools 中不可用的額外功能。它支持本地編輯,這意味著你可以修改代碼并得到調(diào)試器平臺直接支持的更新邏輯。這對于進行快速迭代非常有用。w
假設(shè)你的程序由于災(zāi)難性錯誤(例如內(nèi)存訪問錯誤)而崩潰。這些可能很少見,但確實會發(fā)生,特別是如果你的應(yīng)用程序依賴于本機代碼。
要調(diào)查這類問題,可以使用 llnode。當程序崩潰時,llnode
可以通過將 JavaScript 堆棧框架和對象映射到 C/C++ 端的對象來檢查它們。為了使用它,你首先需要程序的核心轉(zhuǎn)儲。為此你需要使用 process.abort
而不是process.exit
來關(guān)閉代碼中的進程。當你使用 process.abort
時,Node 進程在退出時會生成一個核心轉(zhuǎn)儲文件。
為了更好地理解 llnode
可以提供的功能,這個視頻演示了其一些功能。
除了上述所有以外,還建議用第三方軟件包做進一步調(diào)試。
第一個被簡單地稱為 debug。使用 debug,你可以基于函數(shù)名或整個模塊為日志消息分配特定的命名空間。然后可以通過特定的環(huán)境變量選擇將哪些消息打印到控制臺。
例如,這是一個 Node.js 服務(wù)器,它正在記錄來自整個程序和中間件棧的幾條消息,例如 sequelize
,express:application
和 express:router
:
如果我們將 DEBUG 環(huán)境變量設(shè)置為 express:router
并啟動相同的程序,則僅顯示標記為 express:router
的消息:
通過以這種方式過濾消息,可以深入研究程序單個部分的行為方式,而無需大幅度更改代碼的日志記錄。
trace 和 clarify 兩個模塊最好在一起配合使用。
trace
通過提供有關(guān)被調(diào)用的異步方法的更多詳細信息來擴展你的異步棧跟蹤,這是 Node.js 默認不提供的路線圖。 clarify
通過從特定于 Node.js 內(nèi)部的棧跟蹤中刪除所有信息來提供幫助。這使你可以專注于僅針對程序的函數(shù)調(diào)用。
這些模塊都不建議在生產(chǎn)環(huán)境中運行!僅在本地開發(fā)環(huán)境中進行調(diào)試時才應(yīng)啟用它們。
感謝各位的閱讀!關(guān)于調(diào)試Node.js程序的方法是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!