n8n получил массив в одном item: когда Split Out нужен перед обработкой

API вернул две позиции заказа, а следующий узел n8n выполнил только одно действие. На выходе HTTP Request виден один item, внутри которого лежит массив products. Это корректная форма ответа: сервер упаковал позиции в один документ. Однако большинство следующих узлов обрабатывает входные items, а не автоматически перебирает любой вложенный массив.

Число объектов внутри поля и число элементов потока здесь различаются. Один item может содержать сотню товаров, но для следующего шага он останется одним входным элементом. Чтобы выполнить действие для каждого товара, нужно явно превратить вложенный список в отдельные items. В n8n для этого предназначен узел Split Out.

Смотрим на форму входа

Сначала откройте JSON выхода предыдущего узла. В нашем примере это объект с номером пакета batchId и массивом товаров products. Каждый товар содержит свой id и количество qty. В таблице интерфейса вложенное поле может выглядеть компактно, поэтому важно посмотреть структуру, а не ориентироваться только на число показанных строк.

Для проверки добавьте Code node после Manual Trigger и выберите режим Run Once for All Items. Следующий код создаёт один учебный пакет. Он не обращается к внешнему API и позволяет спокойно настроить дальнейшую обработку до подключения записи в рабочую систему.

return [{ json: {
  batchId: 'batch-7',
  products: [
    { id: 'p-10', qty: 2 },
    { id: 'p-20', qty: 1 },
  ],
} }];

Подключите Split Out. В поле Field to Split Out укажите products. Для Include выберите Selected Other Fields, а в Fields to Include — batchId. В Options → Destination Field Name задайте product. Тогда каждая позиция останется объектом в собственном поле, а номер пакета сохранится рядом.

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

Проверяем результат до записи

После Split Out ожидаются два items. Первый содержит пакет batch-7 и товар p-10, второй — тот же пакет и товар p-20. Добавьте следующий Code node также в режиме Run Once for All Items. Он проверяет форму и возвращает компактный вход для дальнейшего действия. Неверное количество или потерянный номер пакета останавливают процесс, пока запись ещё не выполнена.

return $input.all().map((item, index) => {
  const { batchId, product } = item.json;
  if (typeof batchId !== 'string' || batchId.trim() === '') {
    throw new Error('Missing batchId');
  }
  if (!product || typeof product.id !== 'string' || product.id.trim() === '') {
    throw new Error('Missing product id');
  }
  if (!Number.isInteger(product.qty) || product.qty <= 0) {
    throw new Error('Quantity must be a positive integer');
  }
  return {
    json: { batchId, productId: product.id, qty: product.qty },
    pairedItem: { item: index },
  };
});

Теперь узел записи может читать productId и qty из текущего элемента. Ему не требуется обращаться к первому элементу предыдущего шага или выбирать товар по позиции в массиве. Поле pairedItem сохраняет связь результата проверочного кода со входом, чтобы дальнейшие выражения могли правильно сопоставлять элементы.

Когда разделять не требуется

Если следующий API принимает весь заказ одной операцией, исходный массив может быть как раз нужной формой. Тогда Split Out превратит одну групповую запись в несколько запросов и изменит смысл процесса. Решение определяется договором принимающей стороны: одна операция на пакет или одна операция на товар. Узел нужен во втором случае, когда именно отдельная позиция является единицей действия.

Разделение также не заменяет ограничение частоты запросов. После него следующему узлу действительно доступны отдельные элементы, но отправку в сервис с лимитами нужно настраивать отдельно. Если для этого применяется Loop Over Items, проверьте возврат связи в цикл и выход завершения; соседний разбор о первом обработанном пакете посвящён именно этой задаче.

Принимаем весь путь на примерах

Повторите выполнение с одним товаром, двумя и пустым массивом. Для пустого списка заранее выберите поведение: закончить обработку без записей или выдать отдельное сообщение о пустом заказе. Затем добавьте товар без номера и убедитесь, что проверка остановила процесс. Для двух разных пакетов проверьте, что каждый товар сохранил свой batchId; одинаковые позиции в разных заказах нельзя объединять по одному номеру товара.

При последующем изменении ответа API повторите проверку пути к массиву. Если список переехал внутрь поля data, прежняя настройка products уже не описывает нужный вход. Сохранённый учебный пакет помогает отделить ошибку нового ответа от поломки дальнейших узлов.

В платном курсе «Продвинутый n8n» — откройте программу вы отработаете предсказуемую обработку данных, связь items и тестирование workflow на подготовленных примерах. Дальше можно собрать API-интеграцию с пагинацией и ограниченными повторами, разделить большой процесс на дочерние workflow и проверить контролируемые отказы. Это следующий шаг от правильного числа элементов к автоматизации, которую можно развивать без потери связей между заказом и его позициями.

Продолжить на практике