給 AI 喂正確的上下文
這是你大部分槓桿所在之處。當你報告一個 bug 時,請包含:
- 逐字的錯誤資訊。 原樣複製——不要轉述。轉述一個錯誤,就像在電話裡描述一張照片:你會漏掉那個最關鍵的細節。
- 堆疊跟蹤,尤其是頂部的幾行。
- 相關程式碼——丟擲錯誤的函式,以及它呼叫的任何東西。
- 你期望的結果與實際發生的結果對比。
下面是一個強力除錯提示的真實樣子:
我提交登錄檔單時報錯了。下面是完整的輸出:
TypeError: Cannot read properties of undefined (reading 'email')
at validateUser (src/auth/validate.js:14:23)
at handleSignup (src/routes/signup.js:31:10)
at processTicksAndRejections (node:internal/process/task_queues:95:5)
復現步驟:填好表單,點選 "Sign up"。
期望:一條 "Welcome" 訊息。
實際:頁面變成空白,上面這個錯誤出現在控制台裡。
這是 validate.js(第 14 行附近):
[貼上這個函式]
這是呼叫它的 handleSignup 函式:
[貼上這個函式]
什麼可能導致這個,以及在改動任何東西之前我該如何確認它?
注意最後一行。你是在請求一個假設和一個確認步驟,而不是立即修改。這能讓 AI 保持誠實。
知道如何閱讀你正在貼上的那段跟蹤,會很有幫助。堆疊跟蹤是一份按最新到最舊排列的呼叫歷史:最頂部那行是程式實際爆炸的地方,下面每一行都是呼叫了它上面那個函式的函式。所以在例子裡,validateUser 是 email 從某個 undefined 的東西上被讀取的地方,而 handleSignup 是呼叫 validateUser 的那一方。你自己程式碼下面的幀——比如 processTicksAndRejections——屬於語言執行時;通常你可以忽略它們。從上往下讀,直到碰到第一行指向你的檔案,那幾乎總是該開始檢視的地方。
把同一段跟蹤當作一摞呼叫來讀,順序就一目瞭然了。崩潰在最頂上,下面每一幀都是呼叫了它正上方那一幀的那一方:
讀跟蹤 = 呼叫棧
(頂 = 最新) (誰呼叫了誰)
▲ validateUser :14 ◀── 崩潰 ┌─────────────────┐ ▲ 從這裡
│ handleSignup :31 │ validateUser 14│ │ 開始
│ processTicks... (執行時, ├─────────────────┤ │ 檢視
│ 忽略) │ handleSignup 31│ │
│ ├─────────────────┤ │
└─ 你的程式碼在前 ─────────────────▶│ processTicks... │─┘ (執行時)
└─────────────────┘
向下讀,直到第一行是你的檔案