在程式開發中,如何快速的查找定位問題是一項非常重要的基本功。在實際開發過程中,或多或少都會遇到程式出現問題導致無法正常運行的情況,因此,調試代碼就變成了一項無法避免的工作。這裡簡單介紹下如何調試 node.js 程式。 ...
調試 node.js 程式
在程式開發中,如何快速的查找定位問題是一項非常重要的基本功。在實際開發過程中,或多或少都會遇到程式出現問題導致無法正常運行的情況,因此,調試代碼就變成了一項無法避免的工作。這裡簡單介紹下如何調試 node.js 程式。
使用 console.log
Node 提供了全局的 console 對象,該對象可以輸出格式化的字元串。
console.log 是調試 Node 模塊最簡單的工具,console.log 主要有兩個作用:一是將對象序列化為一個字元串,另一個是向標準輸出流輸出結果。
使用 console.log 檢查對象:
const obj = {
a: 1,
b: 2
}
console.log(obj)
這段代碼將列印出以下信息:
{ a: 1, b: 2 }
註意:實質上 console.log 沒有進行任何格式化操作,而是 console.log 內部調用了 util.format 將傳入的參數格式化,並且將結果輸出到標準輸出流中。
console.log 函數只檢查對象的自有可枚舉屬性,即在原型鏈上的屬性以及不可枚舉的屬性都不會顯示。
例如:
const obj = Object.defineProperty({
a: 1,
b: 2
}, 'a', {
enumerable: false
})
console.log(obj)
不可枚舉屬性 a 不會顯示,這段代碼將列印出以下信息:
{ b: 2 }
console.log 函數可以通過 util.format 函數提供向字元串中插入數值的能力,在字元串中使用 % 首碼作占位符。
例如:
console.log('an object: %j', {a: 1, b: 2})
這段代碼將列印出以下信息:
an object: {"a":1,"b":2}
%j 是一個 JSON 占位符。即如果參數包含迴圈引用,則替換為字元串 '[Circular]'。
當然除了 console.log 函數,還可以使用 console 對象的其他函數調試代碼,例如:console.error、console.table、console.info等等。
註意:在 Node 中,如果向進程的輸出流中寫入數據是一種阻塞操作,寫入記錄時會阻塞事件循壞。因此,在實際項目中應避免使用 console.log。
使用 debugger 調試器
使用 console.log 檢查變數雖然簡單易用,但它也有很糟糕的一面,在複雜程式中很難定位和發現問題,程式輸出冗長,阻塞事件迴圈等。
慶幸的是,V8 引擎導出了一個支持 Node 的調試介面。因此,可以使用 Node 內置的調試器調試你的程式。
創建一個錯誤的程式:
var n = 0
function init () {
n = 1
}
function incr () {
var n = n + 1
}
init()
console.log('n before: %d', n)
incr()
console.log('n after: %d', n)
運行程式,輸出結果如下:
n before: 1
n after: 1
變數 n 並沒有如期遞增,接下來使用調試模式啟動 Node 調試程式:
node --inspect index.js
這樣就會以調試模式啟動 Node,可以看到調試器的提示信息如下:
Debugger listening on ws://127.0.0.1:9229/a94b1d29-81cb-461b-8abc-f1bf87c767b1
For help, see: https://nodejs.org/en/docs/inspector
n before: 1
n after: 1
調試的程式代碼非常少,所以調試立即就完成結束了。
可以通過命令在程式第一行設置斷點:
node --inspect-brk index.js
調試器提示信息如下:
Debugger listening on ws://127.0.0.1:9229/def735ed-3a2a-4772-a40d-077939e76b83
For help, see: https://nodejs.org/en/docs/inspector
這樣調試就不會立即結束。
接著,打開 Chrome 瀏覽器,在地址欄輸入:
chrome://inspect/#devices
在界面 Remote Target 標簽內容中找到要調試的目標(Target)文件,點擊目標中的 inspect 鏈接就可以進入瀏覽器調試面板調試程式了。接下來的調試操作方式和平時調試普通 JavaScript 代碼一樣。