Gernar
Frontend DeveloperHTTP, API и сеть

Интервью-вопрос

Что делать, если при запросе приходит 500?

500 означает внутреннюю ошибку сервера, но хороший frontend-ответ не заканчивается фразой про бэкенд. Нужно проверить запрос, обработать состояние в UI, собрать контекст и не сделать повтором хуже.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 50 правильно

Как лучше сказать, если API вернул 500?

Вы сейчас отвечаете на интервью и хотите показать понимание HTTP и практичный подход фронтенда.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

Код 500 означает Internal Server Error. Сервер получил запрос, но не смог корректно обработать его из-за внутренней ошибки. Важно не застрять на фразе, что это ошибка бэкенда. На интервью покажите полный цикл действий: проверить запрос, защитить пользователя, собрать контекст и передать проблему туда, где ее можно исправить.

Коротко можно ответить так:

500 говорит о сбое на стороне сервера. Но я все равно проверю, не отправил ли фронтенд некорректный запрос. В UI обработаю ошибку, сохраню пользовательские данные и соберу request id, endpoint, время и шаги воспроизведения для команды бэкенда.

Что проверить на фронтенде

Начните с того, что находится под вашим контролем. Проверьте endpoint, HTTP-метод, заголовки, токен, формат тела и обязательные поля. Иногда сервер должен вернуть 400 или 422, но из-за слабой валидации падает с 500. Для пользователя это все равно выглядит как поломка. Для команды важно понять, какой запрос ее вызывает.

Пример безопасной обработки через fetch:

async function loadProfile() {
  const response = await fetch("/api/profile", {
    headers: { Accept: "application/json" },
  });

  if (!response.ok) {
    throw new Error(`Request failed with status ${response.status}`);
  }

  return response.json();
}

Важно: fetch не бросает исключение только из-за статуса 500. Если не проверить response.ok, код может попытаться парсить ошибочный HTML как JSON и сломаться уже на клиенте. В React-компоненте следите, чтобы устаревший ответ не перезаписал новое состояние. Для этого отменяйте запрос через AbortController или проверяйте актуальность запроса перед setState.

Как обработать UI

Пользователь не должен видеть stack trace, название внутреннего сервиса или SQL-ошибку. Ему нужно понять, что действие не завершилось, данные не потеряны и есть понятный следующий шаг. Для формы это особенно важно: не очищайте поля до подтвержденного успеха.

Плохой вариант:

// Плохо: форма очищается до того, как сервер подтвердил успех.
setForm(initialForm);
await submitForm(form);

Что сломается: при 500 пользователь потеряет введенный текст, а повторная отправка станет невозможной или приведет к ошибке с неполными данными. Если кнопка при этом не блокируется на время запроса, пользователь может отправить несколько одинаковых запросов.

Более безопасный вариант:

async function handleSubmit() {
  if (status === "loading") return;

  setStatus("loading");

  try {
    await submitForm(form);
    setStatus("success");
    setForm(initialForm);
  } catch (error) {
    setStatus("error");
  }
}

Так пользователь не теряет введенные данные при 500 и может повторить отправку. Кнопку отправки лучше отключить на время loading. Ошибку покажите в области с aria-live, чтобы ее услышали пользователи скринридеров. Если операция может создать дубликат, добавьте защиту на уровне API, например idempotency key, или сначала проверьте статус операции.

Когда можно повторять запрос

Как решить, делать ли retry

1Это запрос на чтение данных?
Можно сделать ограниченный retry, показать skeleton или error state, затем дать кнопку Повторить.
2Это изменение данных без идемпотентности?
Не повторяйте автоматически. Покажите статус и попросите пользователя повторить действие вручную.
3Есть idempotency key или отдельная проверка статуса?
Можно безопаснее повторить или проверить результат операции, чтобы не создать дубль.
4Ошибка массовая или повторяется у многих пользователей?
Включите деградацию UI, ограничьте шумные запросы и передайте контекст команде сервера.

Retry полезен для временных сбоев, но опасен для действий с побочным эффектом. Если это загрузка списка, можно сделать 1-2 повтора с задержкой и затем показать кнопку "Повторить". Если пользователь ушел со страницы или сменил фильтр, старый retry нужно отменить, иначе он может перезаписать актуальные данные. Если это платеж, создание заказа или отправка формы, автоматический повтор без идемпотентности может создать дубль.

Разные сценарии в интерфейсе

Как реагировать на 500 во фронтенде

Загрузка спискаGET

Можно показать empty/error state и предложить повторить запрос. Автоматический retry допустим с лимитом и задержкой.

Отправка формыPOST

Не очищайте форму до подтверждения успеха. Иначе пользователь потеряет данные и не сможет повторить действие.

Оплата или заказPOST + money

Не повторяйте запрос вслепую. Нужен идемпотентный ключ или проверка статуса операции.

Optimistic UIrollback

Если UI уже изменен, при ошибке нужно откатить состояние или явно показать, что действие не сохранено.

На интервью покажите, что вы не обрабатываете все 500 одинаково. Ошибка при загрузке второстепенного виджета не должна ломать всю страницу. Ошибка при сохранении формы должна сохранять введенные данные. Ошибка при оплате требует особенно аккуратного статуса, потому что пользователь может бояться повторного списания.

Что передать для диагностики

Команде, которая будет чинить сервер, нужен не общий текст про ошибку 500, а воспроизводимый контекст. Полезно передать:

  • endpoint и HTTP-метод;
  • точное время и окружение;
  • status code и request id или trace id;
  • версию фронтенда, браузер и роль пользователя, если это влияет на сценарий;
  • шаги воспроизведения;
  • обезличенный payload без токенов, паролей и приватных данных.

Так вы покажете, что умеете не только написать catch, но и довести проблему до исправления.

Практический вывод

На интервью отвечайте в таком порядке: что означает 500, что вы проверяете на фронтенде, как защищаете пользователя, как собираете диагностику и как относитесь к повтору запроса. Это звучит сильнее, чем просто отправить всех смотреть логи сервера. Frontend developer отвечает за клиентское поведение и качество пользовательского сценария.

Короткая финальная формулировка:

500 я воспринимаю как серверную ошибку, но проверяю свой запрос и контракт API. В интерфейсе показываю понятное состояние, не теряю данные пользователя, ограничиваю retry и передаю команде сервера request id, endpoint, время и шаги воспроизведения.

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Считать, что фронтенд ни при чем

    500 действительно приходит от сервера, но причиной мог стать неожиданный запрос от клиента. Проверьте контракт, заголовки, тело, авторизацию и версию API, иначе вы передадите бэкенду неполный сигнал.
  2. 2

    Показывать пользователю техническую ошибку

    Stack trace, SQL error или текст исключения пугают пользователя и могут раскрывать внутренние детали системы. Лучше показать спокойное сообщение, сохранить состояние формы и предложить повторить позже.
  3. 3

    Делать бесконечный retry

    Бесконечные повторы нагружают уже проблемный сервис и могут создать дубликаты операций. Используйте лимит, задержку, отмену запроса и проверяйте, безопасно ли действие повторять.
  4. 4

    Терять пользовательские данные

    Если форма очистилась до получения успешного ответа, пользователь может потерять введенный текст. Очищайте форму только после подтвержденного успеха или сохраняйте черновик до завершения запроса.
  5. 5

    Логировать секреты

    В клиентские логи и тикеты нельзя отправлять токены, пароли, cookies и полные персональные данные. Для диагностики обычно достаточно request id, времени, endpoint, статуса и обезличенного контекста.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которыми проверяют понимание HTTP-ошибок, retry и обработки состояния в интерфейсе.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание