Пошаговые инструкции Для начинающих 11 мин

Как обработать ошибки HTTP Request в n8n

Разведите успешный ответ, HTTP 401/429/500 и тайм-аут по разным веткам. 12 шагов, учебный API, готовый workflow и проверка без реальных клиентских данных.

n8n HTTP Request Обработка ошибок

Запрос к API может закончиться тремя разными результатами: пришли нужные данные, сервер ответил кодом ошибки или ответа вообще не удалось получить. Соберём схему, которая различает эти случаи. Вместо настоящей CRM используем локальный учебный API: он выдаёт заранее известные ответы и не меняет чужие данные.

Результат инструкции

После запуска получите заказ O-101 на 1200 в Success Result. При 401, 429, 500 или 404 получите запись needs_review в HTTP Failure. При тайм-ауте запись попадёт в Transport Failure. Ни одна ошибка не должна превратиться в готовый заказ. Это ручной прототип диагностики, без автоматической рассылки, оплаты и повторов запроса.

Что понадобится

  • Windows с запущенным Docker Desktop и локальный n8n; маршрут рассчитан на Docker Desktop, а не n8n Cloud.
  • Права создавать новый учебный workflow. Старые схемы менять не нужно.
  • PowerShell и свободный локальный порт 18111. Ключи API, AI-модель и платный сервис не требуются.

Установить локальный n8n через Docker

Шаг 1. Проверьте Docker и откройте отдельную папку

Откройте PowerShell. Создайте папку ezgpt-http-errors в удобном месте и перейдите в неё. docker version должен показать раздел Server. Если его нет, запустите Docker Desktop и дождитесь работающего движка. Не останавливайте остальные контейнеры.

powershell
docker version
Get-NetTCPConnection -LocalPort 18111 -State Listen -ErrorAction SilentlyContinue

Вторая команда не должна показать слушающий процесс. Если порт занят, выберите другой и одинаково поменяйте опубликованный порт в шаге 3 и URL в Demo Input. Внутренний порт API оставьте 18111.

Шаг 2. Скачайте учебный API и workflow

В этой отдельной папке выполните команды ниже. Не используйте папку с одноимёнными рабочими файлами: curl сохраняет результат по указанному имени. Первый файл - небольшой сервер с пятью тестовыми маршрутами, второй - схема из семи узлов. В них нет credentials.

powershell
curl.exe --fail --location "https://ezgpt.ru/storage/article-files/n8n-errors-mock-api.cjs" --output n8n-errors-mock-api.cjs
curl.exe --fail --location "https://ezgpt.ru/storage/article-files/n8n-http-errors-demo.json" --output n8n-http-errors-demo.json

Скачать учебный API

Скачать готовый workflow

Откройте API в текстовом редакторе перед запуском: /ok возвращает заказ, /unauthorized - 401, /limited - 429, /unavailable - 500, /slow задерживает ответ на три секунды. Любой другой путь возвращает 404. Это наш тестовый код, не API платёжного сервиса.

Шаг 3. Запустите API только на локальном порту

Из папки с файлом выполните одну команду. Она использует официальный образ n8n как среду Node.js; второй экземпляр редактора не запускается. Файл подключён только для чтения, порт опубликован на 127.0.0.1, а не на всех сетевых интерфейсах. Внутри контейнера сервер слушает 0.0.0.0 для работы проброса порта.

powershell
docker run --rm -d --name ezgpt-http-errors-api -p 127.0.0.1:18111:18111 --mount "type=bind,source=$((Get-Location).Path),target=/demo,readonly" --entrypoint node n8nio/n8n:2.42.4 /demo/n8n-errors-mock-api.cjs
docker logs ezgpt-http-errors-api

В журнале должна появиться строка Demo API listening on container port 18111. Если имя контейнера уже занято, сначала разберитесь, что это за контейнер; не удаляйте его автоматически.

Шаг 4. Проверьте ответы вне n8n

powershell
curl.exe -i "http://127.0.0.1:18111/ok"
curl.exe -i "http://127.0.0.1:18111/limited"

Первый ответ содержит HTTP 200 и заказ. Второй - HTTP 429, Retry-After: 2 и error: demo_rate_limit. curl здесь намеренно без --fail: нужно увидеть тело ошибочного HTTP-ответа. Если ответа нет, проверьте контейнер и порт, а не поля workflow.

json
{
  "order_id": "O-101",
  "amount": 1200
}

Шаг 5. Импортируйте схему в новый workflow

В локальном редакторе n8n создайте новый workflow. В меню с тремя точками выберите Import from File и файл n8n-http-errors-demo.json. Не импортируйте его поверх рабочей схемы. Проверьте семь узлов: Manual Trigger, Demo Input, Fetch Demo, HTTP Success, Success Result, HTTP Failure, Transport Failure. Оставьте ручной запуск; Publish не нужен.

В Demo Input указан http://host.docker.internal:18111/ok. Этот адрес нужен контейнеру n8n на Docker Desktop. localhost внутри такого контейнера указывает на сам n8n, а не на Windows. Если n8n работает непосредственно в Windows без Docker, используйте http://127.0.0.1:18111/ok. Linux и Cloud требуют другой сетевой настройки и в этом упражнении не проверялись.

Почему контейнер не видит localhost: официальная справка n8n

Шаг 6. Проверьте настройки Fetch Demo

Откройте HTTP Request с именем Fetch Demo. Метод GET, Authentication: None; URL в режиме Expression: {{ $json.url }}. В Options проверьте Response и Timeout.

  • Include Response Headers and Status: включено.
  • Never Error: включено.
  • Response Format: JSON.
  • Timeout: 1000 миллисекунд.
  • В Settings: On Error → Continue (using error output); Retry On Fail выключен.

Never Error здесь позволяет прочитать HTTP 401/429/500 как данные и затем проверить statusCode. Это не делает ошибочный ответ успешным заказом. Если сервер не прислал ответ вовремя, используем отдельный error output. Обычный Continue для этой схемы не подходит: ошибки должны идти отдельной линией.

Параметры Response и Timeout в HTTP Request

Шаг 7. Проверьте условие успешного HTTP-ответа

Откройте If с именем HTTP Success. В режиме All / AND нужны два числовых условия: {{ $json.statusCode }} greater than or equal 200 и {{ $json.statusCode }} less than 300. Преобразование типов не требуется: HTTP Request возвращает числовой код. Соедините true с Success Result, false с HTTP Failure; error output самого Fetch Demo должен вести напрямую в Transport Failure.

Настроить If и две ветки

Проверка диапазона 2xx - только первый фильтр. Даже HTTP 200 может содержать неверные бизнес-данные. В нашем /ok форма заранее известна; перед подключением настоящего API добавьте проверку схемы, обязательных полей и признака успеха из его документации.

Шаг 8. Проверьте поля успешного результата

В Edit Fields с именем Success Result выберите Manual Mapping и четыре поля ниже. status - Fixed, остальные значения - Expression. Типы status/order_id: String, http_status/amount: Number. Include Other Input Fields выключено.

text
status: ready
http_status: {{ $json.statusCode }}
order_id: {{ $json.body.order_id }}
amount: {{ $json.body.amount }}

Выполните весь workflow с адресом /ok. Success Result должен содержать одну запись: status ready, http_status 200, order_id O-101, amount 1200. HTTP Failure и Transport Failure в этом запуске не должны выполняться.

Шаг 9. Проверьте HTTP-ошибку и сохраните её код

В HTTP Failure оставьте только пять полей. Fixed: status = needs_review, error_kind = http. Expression: http_status = {{ $json.statusCode }}, message = {{ $json.body.error ?? "demo_http_error" }}, retry_after = {{ String($json.headers["retry-after"] ?? "") }}. Тип http_status - Number, остальных - String.

В Demo Input поменяйте только окончание URL на /limited и выполните весь workflow заново. Получится запись ниже. Успешная ветка не выполняется. Значение retry_after только сохранено, никакого ожидания или повторного запроса схема не делает.

json
{
  "status": "needs_review",
  "error_kind": "http",
  "http_status": 429,
  "message": "demo_rate_limit",
  "retry_after": "2"
}

Для настоящего API имя поля error и формат тела могут быть другими. Не копируйте эту формулу вслепую. Retry-After также может быть HTTP-датой, а не числом секунд; здесь API специально возвращает строку 2.

Шаг 10. Проверьте тайм-аут через error output

В Transport Failure должны быть String-поля status = needs_review, error_kind = transport и message в Expression с формулой ниже. Это отдельная запись о транспортном сбое, без выдуманного http_status: HTTP-ответа с кодом может вообще не быть.

javascript
{{ $json.error?.message ?? $json.error ?? "demo_transport_error" }}

Поменяйте Demo Input на /slow и запустите всю цепочку. API ждёт три секунды, Timeout в Fetch Demo равен одной секунде. В нашем тесте Transport Failure получил сообщение timeout of 1000ms exceeded. HTTP Failure и Success Result не выполнялись. Точный текст сообщения может отличаться в другой версии.

Это проверка тайм-аута ожидания ответа, не полная проверка DNS, TLS и обрывов во время большой загрузки. Не выключайте проверку сертификатов ради подключения настоящего API.

Шаг 11. Прогоните шесть адресов и восстановите успех

По очереди меняйте только путь в Demo Input и каждый раз выполняйте весь workflow. Проверяйте результаты именно текущего запуска, а не старое OUTPUT или закреплённые данные.

  • /ok: Success Result, ready, код 200, заказ O-101 и сумма 1200.
  • /unauthorized: HTTP Failure, needs_review, код 401, demo_invalid_token.
  • /limited: HTTP Failure, needs_review, код 429, retry_after = "2".
  • /unavailable: HTTP Failure, needs_review, код 500, demo_server_error.
  • /missing: HTTP Failure, needs_review, код 404, demo_not_found.
  • /slow: Transport Failure, needs_review и непустое сообщение. Затем снова /ok: вернётся готовый заказ.

При обработанной ошибке весь workflow может завершиться зелёным статусом: программа дошла до предусмотренной ветки. Бизнес-результат при этом needs_review, не ready. Этот пример показывает данные в OUTPUT, но не пишет их в постоянный журнал и не отправляет уведомление. Для рабочего запуска отдельно подключите хранение результата с ID исходной заявки и ограничьте чувствительные поля.

Шаг 12. Остановите только учебный API

После проверки сохраните ручной workflow без публикации и остановите только контейнер из шага 3. Из-за --rm он будет удалён после остановки; скачанные файлы останутся в вашей папке. Рабочий n8n и остальные контейнеры не затрагиваются.

powershell
docker stop ezgpt-http-errors-api

Если результат отличается

Симптом Причина Что исправить
401 попадает в ошибку узла Never Error выключен Включить и проверить If
Ошибка названа ready Ветки If перепутаны true → успех, false → HTTP Failure
Нет statusCode Не включён полный ответ Include Response Headers and Status
Timeout останавливает схему Нет отдельного error output Continue (using error output)
Connection refused API не запущен или неверный адрес Проверить контейнер, порт и hostname
Виден старый ответ OUTPUT от другого запуска Снять pin и выполнить всю цепочку

Почему здесь нет автоматических повторов

Сначала нужно отличать причину сбоя, а затем выбирать действие. Для 401 проверьте credentials; бесконечные повторы не исправят ключ. Для 429 учитывайте лимиты API. Сбой 500 может быть временным, но повтор разрешён не для любой операции. После тайм-аута создания платежа или заказа действие уже могло выполниться на сервере: слепой повтор способен создать дубль.

В этой схеме Never Error превращает HTTP 500 в данные: Retry On Fail не следует считать готовой обработкой таких кодов. Мы оставили его выключенным. Ограниченные повторы, backoff и идемпотентность требуют отдельной настройки и тестов; этот материал их не реализует.

Когда нужен Error Trigger

Отдельный error workflow полезен для необработанных ошибок выполнения. Но в нашем примере HTTP-сбой и тайм-аут сознательно превращены в needs_review, поэтому нельзя ждать от Error Trigger уведомления о каждом таком случае. Для отправки оператору нужно подключать действие к нужной ветке. Уведомления, автоматические триггеры и Error Trigger здесь не настроены.

Обработка ошибок выполнения: официальная документация n8n

Что нельзя подключать в первой версии

Не заменяйте Success Result оплатой, удалением записи или отправкой письма клиенту. Сначала проверьте формат ответа и статус. Не выводите в message весь запрос с токеном или содержимое клиентских документов. Внешнее действие требует своих прав, журналирования и защиты от повторов; зелёная линия на холсте этого не обеспечивает.

Что проверено редакцией

11 октября 2026 года схема выполнена через CLI n8n 2.42.4 в отдельной тестовой базе. Проверены шесть реальных HTTP-сценариев с локальным учебным API: 200, 401, 429, 500, 404 и тайм-аут 1000 мс. Проверки точных данных успеха, кодов и сообщений HTTP-ошибок, Retry-After и отсутствия ready при сбое прошли. Тестовый API остановлен; существующие workflows и основной контейнер n8n не менялись. Ручной запуск в редакторе, Cloud, реальные credentials, DNS/TLS-сбои, автоматические повторы, Error Trigger, уведомления и постоянное хранение журнала не проверялись. Обложка - редакционная иллюстрация, не снимок интерфейса.

Частые вопросы

Почему Never Error не исправляет ошибку API?

Он позволяет получить ошибочный HTTP-ответ как данные. Код всё равно нужно проверить. В этой схеме If направляет 401, 429, 500 и 404 в needs_review, а не в готовый заказ.

Что делать, если n8n не видит localhost?

В контейнере localhost указывает на сам контейнер. Для проверенного маршрута Docker Desktop используется host.docker.internal:18111. Сначала убедитесь, что учебный API запущен и отвечает в PowerShell.

Чем тайм-аут отличается от HTTP 500?

При 500 сервер прислал HTTP-ответ, его код можно сохранить. При тайм-ауте Fetch Demo не дождался ответа и передал ошибку через отдельный error output. В тесте эти случаи попали в разные ветки.

Почему workflow зелёный, хотя получен needs_review?

Ошибка была обработана предусмотренной веткой, поэтому выполнение завершилось. Проверяйте бизнес-статус и данные, а не только цвет: needs_review не является успешным заказом.

Можно ли использовать этот API в n8n Cloud?

Этот маршрут рассчитан на локальный Docker Desktop. Cloud не получает доступ к локальному порту компьютера по host.docker.internal. Не открывайте учебный сервер в интернет ради упражнения; сетевое подключение Cloud нужно проектировать отдельно.

Дальше по теме

Похожие материалы