Ошибка 500 — что значит и как чинить: 3 причины, с которых начать

Открываешь свой задеплоенный сайт, а вместо страницы — холодное «500 Internal Server Error». Паника: «всё сломалось, и непонятно где». Вот что сразу сужает поиск вдвое: первая цифра кода говорит, чья это вина. Ошибки на 4 (404, 400, 403) — про запрос: ты не туда постучался или прислал кривое. Ошибки на 5 (500, 502, 503) — про сервер. Значит, запрос дошёл, но твой код упал уже внутри.
Вывод, который экономит вечер: при 500 не ройся в браузере и не правь фронтенд. Иди в логи сервера — причина там. Разберём три самые частые, начиная с лидера.
Симптом
Страница не открывается, в ответе — 500 Internal Server Error (или просто «что-то пошло не так»). В DevTools → Network упавший запрос горит красным со статусом 500. Важно: это не «сервер недоступен» — он ответил, просто ответом стала ошибка. Значит, до твоего кода дошло, и сломалось в нём.
Причина 1 (самая частая): код упал на необработанной ошибке
В девяти случаях из десяти — это исключение в твоём коде: обратился к полю, которого нет, поделил на ноль, распарсил кривой JSON. Сервер не знал, что с этим делать, и вернул общий 500.
Как проверить. Открой логи на хостинге (в панели Vercel/Railway/Render — раздел Logs или Runtime Logs; в Supabase — логи функции). Там будет настоящая ошибка и строка, на которой упало — то самое, что 500 от тебя прячет.
Как починить. Найди в логе строку с Error и стек вызовов — он показывает файл и номер строки. Дальше либо чини логику, либо, если не очевидно, скопируй текст ошибки целиком и разбери его вместе с ИИ: «вот стек ошибки с прода, объясни причину и предложи фикс». 500 само по себе бесполезно — а вот запись в логе уже конкретна.
Причина 2: на сервере нет переменной окружения
Классика «локально работало, на проде 500». Твой код читает ключ или адрес из переменных окружения (process.env.API_KEY), локально они лежали в файле .env — а в облако ты его (правильно!) не залил. Значит, на сервере переменной нет, код получает undefined, дёргает им API или базу — и падает.
Как проверить. В логе ошибка вида undefined is not..., cannot read property of undefined или «ключ не найден» рядом с обращением к базе/сервису. И главный признак: локально всё работает, ломается только после деплоя.
Как починить. Открой на хостинге раздел Environment Variables и пропиши те же пары ИМЯ=значение, что были в .env. Затем передеплой — многие хостинги подхватывают новые переменные только при следующей сборке. Ошибка уйдёт.
Причина 3: сервер не достучался до базы или внешнего API
Твой код пытается подключиться к базе данных или к чужому сервису, а соединения нет: неверная строка подключения, база уснула на бесплатном тарифе, у внешнего API кончился лимит или он сам отдал ошибку. Твой сервер ждёт ответа, не получает — и роняет 500.
Как проверить. В логе — таймаут или connection refused / ECONNREFUSED рядом с обращением к базе/сервису. Проверь, жива ли база (открой её панель) и верна ли строка подключения в переменных окружения.
Как починить. Поправь данные подключения, разбуди базу, проверь лимиты внешнего сервиса. И на будущее — оборачивай внешние вызовы в обработку ошибок (try/catch), чтобы отдавать пользователю внятное сообщение, а не голое 500.
Чем 500 отличается от 404?
404 — ошибка на 4, то есть про запрос: страница или адрес не найдены, ты постучался не туда. 500 — ошибка на 5, про сервер: адрес верный, запрос дошёл, но код на сервере упал при обработке. Грубо: 404 — «такого нет», 500 — «есть, но сломалось».
Почему 500 ничего не объясняет?
Это сделано нарочно, ради безопасности: показывать чужим людям стек ошибки и внутренности кода нельзя. Поэтому наружу отдаётся обтекаемое 500, а настоящая причина пишется в логи сервера — туда, куда есть доступ только у тебя. Логи и есть место, где 500 превращается в конкретную ошибку.
500 — это ошибка CORS?
Нет, это разные вещи. Ошибка CORS — это когда браузер прячет ответ из-за политики безопасности (сам запрос при этом часто успешен). А 500 — это сам сервер вернул ошибку при обработке. Если в Network статус именно 500 — дело в серверном коде, а не в CORS.
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





