nestjs 透過分層架構讓職責切分到多個不同的元件上,當要查找問題時就可以針對該負責的元件做修改。了解整個請求的生命周期,才能比較具有方向性去除錯,不會如同大海撈針。而其整個生命周期如下圖:
當成是遇到非預期的結果時,開發者希望從程式上的邏輯去檢測實際執行的當下狀況時,直覺上會想要加入 log。往往需要耗費眼力去觀察結果是否有除錯用的旗號,甚至是發現加入的旗號不會出現在執行點上。
最省時且直接的方式是,如果能在要執行的程式下中斷點,讓程式執行能夠逐步照開發者關注的中斷點去檢查執行狀態。 vscode 這個整合開發編輯器提供了一個 launch.json 的方式,可以讓程式以除錯的模式逐步執行。
以下是使用 pnpm 作為 nodejs 的 pacakge manager 的範例。建立一個 launch.json 在 .vscode 資料夾下:
{
"version": "2.0.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Debug Nest Framework",
"runtimeExecutable": "pnpm", // 此處可以替換為該專案使用的 node module 管理套件工具
"runtimeArgs": [
"run",
"start:debug",
"--",
"--inspect-brk"
],
"autoAttachChildProcesses": true,
"restart": true,
"sourceMaps": true,
"stopOnEntry": false,
"console": "integratedTerminal",
}
]
}
然後就可以下中斷點,接著使用除錯模式啟動,然後就可以逐步執行驗證流程。如下圖:
雖然已經有了中斷點,但還是有可能會遇到。除錯模式走不到中斷的狀況。因為有可能當初的設計造成根本無法走如預期的中斷點。
所以,除錯前應該有幾件事情要做:
這樣找起錯誤,會相對範圍比較小,讓除錯的效率提升。
vscode 提供的這個中斷點工具,能夠讓開發者在開發階段,就可以確認程式邏輯的執行流程。中斷點相對於埋 log 去找方便的多。但是如果在線上系統找錯誤,需要在適當的地方做對應的 error log 處理。因為線上系統是儘量不要且不應該因為除錯重新佈署。
埋 log 的要點,可以透過一些 log 程式設定不同的 log level,來幫來查詢錯誤時,可以方便過濾掉一些不重要的資訊。且 log 必須要是重點式下,不應該放過多,不具識別性的 log 造成混淆。