Перейти к содержимому
PD
n8n

Данные и выражения в n8n: элементы, $json и почему нода срабатывает много раз

Как устроены данные в n8n: массив элементов вместо объекта, выражения $json и $node, обращение к предыдущим нодам, работа с вложенным JSON, объединение и разбиение потоков и типичные ошибки с пустыми данными.

Все статьи гида n8n · 18

Большинство проблем в n8n - это не проблемы логики, а проблемы формы данных. Разобравшись с тем, как данные текут по воркфлоу, вы закроете вопросов больше, чем изучением любых конкретных нод.

Данные - это массив, а не объект

Ключевая модель: между нодами передаётся массив элементов. Каждый элемент - самостоятельный кусочек данных со своим JSON.

Отсюда следует главное: нода выполняется по разу на каждый элемент. Получила 50 элементов - сделает 50 HTTP-запросов, отправит 50 сообщений, создаст 50 записей.

Это не баг, а модель, но именно она даёт классические сюрпризы: «почему бот отправил 50 писем вместо одного» и «почему API забанил меня за частоту». Если нужен один запуск - сведите элементы в один заранее, а не надейтесь, что нода «поймёт».

Обратная ситуация тоже частая: API вернул один элемент, внутри которого массив из 50 объектов. Для n8n это по-прежнему один элемент - следующая нода отработает один раз. Чтобы работать с ними поштучно, массив нужно разложить в элементы.

Выражения

Везде, где поле принимает значение, можно вместо константы подставить выражение - обращение к данным.

  • $json - JSON текущего элемента. Поле берётся как $json.email или $json["Имя поля"], если в имени пробелы или кириллица.
  • Обращение по имени ноды - данные конкретного предыдущего блока, а не непосредственно предыдущего.
  • Служебные значения - текущее время, номер выполнения, данные воркфлоу.

Практический совет, который экономит часы: переименовывайте ноды осмысленно сразу. Выражение, ссылающееся на HTTP Request1, нечитаемо через месяц и ломается при перестановке блоков. Получить заказ - читается и переживает рефакторинг.

Вложенный JSON

Реальные API возвращают вложенность, и это второе место, где спотыкаются. Путь пишется через точку: $json.customer.address.city.

Проблема в том, что любое звено может отсутствовать. Если customer пришёл пустым, обращение к .address.city уронит выполнение. На данных, где часть полей необязательна, это гарантированный источник плавающих падений - воркфлоу работает неделю, а потом приходит запись без адреса.

Защищаться стоит там, где поле реально может не прийти: проверять наличие до обращения или подставлять значение по умолчанию. Тотально обвешивать проверками всё не нужно - только те поля, отсутствие которых вероятно.

Разветвление и объединение

Условия и ветвление делят поток: часть элементов идёт одним путём, часть - другим. Обычная ошибка - забыть, что вторая ветка тоже требует обработки; элементы, ушедшие в неё, не исчезают, они просто идут по другому маршруту.

Объединение потоков - операция, где чаще всего рождаются неожиданности. Соединить два набора данных можно по-разному: сцепить подряд, сопоставить по ключу, взять пересечение. Если после объединения элементов оказалось больше, чем вы ожидали, - почти всегда выбран не тот режим, а не «n8n продублировал».

Отладка: смотрите на данные, а не на схему

Главный инструмент - история выполнений. В ней видно, что пришло в каждую ноду и что из неё вышло. Диагностика почти всегда сводится к тому, чтобы найти первую ноду, где данные перестали быть тем, чем вы их считали.

Порядок, который работает:

  1. Откройте выполнение и идите слева направо, пока не найдёте первое расхождение с ожиданием.
  2. Смотрите не только значения, но и количество элементов - резкий рост или падение обычно и есть корень проблемы.
  3. Проверьте, не пустой ли вход. Нода, получившая ноль элементов, не выполнится вообще - и это выглядит как «шаг пропустился», хотя всё логично.

Последний пункт стоит отдельного внимания: пустой результат в n8n почти никогда не ошибка сам по себе. Он молча тормозит всю ветку ниже.

Типовые грабли

  • Число пришло строкой. API часто отдаёт "42", а сравнение с числом даёт неожиданный результат.
  • Пустая строка не то же самое, что отсутствие поля. Проверки на существование и на пустоту - разные проверки.
  • Регистр имён полей. Email и email - разные поля, и это классический источник «почему пусто».
  • Ноль элементов на входе. Ветка тихо не выполняется, никакой ошибки нет.

Если воркфлоу ведёт себя необъяснимо, начните с гипотезы «данные не той формы» - она подтверждается чаще всех остальных вместе взятых. Что делать, когда падение уже случилось, разобрано в статье про обработку ошибок.

Вопросы и ответы

Почему нода в n8n выполняется несколько раз?

Потому что данные в n8n - это массив элементов, и нода выполняется по одному разу на каждый элемент. Если предыдущая нода вернула 50 записей, следующая сделает 50 запросов. Это не ошибка, а модель работы: чтобы получить один запуск, элементы нужно предварительно свести в один элемент.

Как в n8n обратиться к данным из предыдущей ноды?

К данным текущего элемента - через $json, к результату конкретной ноды - обращением по её имени. Именно поэтому ноды стоит переименовывать осмысленно: выражение, ссылающееся на «HTTP Request1», ломается при первой же перестановке блоков и нечитаемо через месяц.

Ещё по теме

Сделаю под ключ

Соберу автоматизацию на n8n или кодом

Заявки, таблицы, CRM и Telegram связаны между собой, и никто больше не переносит данные руками.

от 300 $ · 3-7 дней

Похожий кейсАвтоматизация выдачи лицензий для BAS-скриптов на MakeСценарий в Make, который по одному сообщению в Telegram генерирует логин и пароль, выдаёт лицензию на срок, подключает FingerprintSwitcher Business и пишет строку в Google Sheets.

«Спасибо Павлу, поставленная задача выполнена. Всегда на связи, дал подробную инструкцию и руководство, буду обращаться, всем рекомендую.»

MarkBorisov · Kwork