~/VibeHandbook
PDF бесплатно

Глава 12 · 03

Как дать 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... │─┘ (рантайм)
                                   └─────────────────┘
   читай ВНИЗ до первой строки, что в ТВОЁМ файле

Хотите офлайн-версию?

Скачайте всю книгу в PDF или EPUB — бесплатно.