Как дать AI правильный контекст
Именно здесь сосредоточена большая часть вашего рычага. Когда вы сообщаете о баге, включите:
- Сообщение об ошибке дословно. Скопируйте его точно — не пересказывайте. Пересказать ошибку — всё равно что описывать фотографию по телефону: вы упустите ту единственную деталь, которая имела значение.
- Стек вызовов, особенно несколько верхних строк.
- Релевантный код — функцию, которая выбросила ошибку, плюс всё, что она вызывает.
- Что вы ожидали против того, что произошло.
Вот как на самом деле выглядит сильный запрос на отладку:
Я получаю ошибку, когда отправляю форму регистрации. Вот полный вывод:
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... │─┘ (рантайм)
└─────────────────┘
читай ВНИЗ до первой строки, что в ТВОЁМ файле