N8n example loop use

N8n: Практическое использование циклов (Loops) в автоматизации рабочих процессов

N8n — это инструмент с открытым исходным кодом для оркестрации рабочих процессов (workflow automation), который использует подход, основанный на узлах (node-based). Одной из самых мощных возможностей платформы является реализация циклов (Loops), позволяющая обрабатывать коллекции данных, выполнять повторяющиеся операции и создавать сложные, итеративные логики без написания кода. Циклы в n8n не являются отдельным узлом, а представляют собой концепцию, реализуемую комбинацией специальных узлов и правильной настройкой потока данных.

Основные узлы для создания циклов в n8n

Для организации цикличных операций в n8n используются несколько ключевых узлов, каждый из которых применяется в определенных сценариях.

Узел «Split In Batches» (Разделить на партии)

Этот узел предназначен для итеративной обработки элементов массива (списка), поступающего на вход. Он не запускает весь рабочий процесс заново для каждого элемента, а выполняет только те узлы, которые расположены после него, в цикле для каждой партии или каждого элемента.

    • Принцип работы: Узел принимает входящий массив данных, разбивает его на отдельные элементы или группы (батчи) и пропускает каждый элемент/батч через последующую часть workflow.
    • Ключевые настройки:
      • Batch Size: Количество элементов в одной итерации. При значении 1 узел будет обрабатывать элементы по одному.
      • Options -> Reset: Если включено, данные из предыдущих итераций не накапливаются.
    • Идеальный сценарий использования: Последовательная отправка индивидуальных email-сообщений списку получателей, обработка строк таблицы по одной, поэтапная загрузка файлов.

    Узел «HTTP Request» в цикле

    Часто циклы создаются путем настройки узла HTTP Request на получение массива данных (например, от API), с последующей его обработкой узлом «Split In Batches» или путем активации собственного цикла workflow.

    Узел «Loop Over Items» (Цикл по элементам) — Code Node

    Хотя в n8n нет отдельного узла с таким названием, эту функцию часто реализуют с помощью узла «Code» (JavaScript/Python). Это предоставляет максимальную гибкость для создания сложных циклов, включая вложенные циклы, обработку с условиями и преобразование данных на лету.

    • Принцип работы: В узел Code поступает массив данных. С помощью скрипта организуется цикл (for, forEach, map), в теле которого для каждого элемента выполняются необходимые операции. Результаты собираются в новый массив и возвращаются на выход узла.
    • Преимущество: Полный контроль над логикой итерации, возможность добавления сложных условий и преобразований.

    Узел «Wait» (Ожидание) в циклах

    Для создания пауз между итерациями (например, чтобы не превысить лимиты API) внутри цикла используется узел «Wait». Он может быть настроен на фиксированную задержку или ожидание до определенного времени.

    Практические примеры использования циклов

    Пример 1: Отправка персонализированных email через SMTP

    Цель: Отправить каждому контакту из списка Google Sheets индивидуальное email-сообщение.

    • Шаг 1: Узел «Google Sheets» -> «Get Rows». Получаем данные таблицы, где есть столбцы: Email, Name, OrderId.
    • Шаг 2: Узел «Split In Batches». Batch Size = 1. Он возьмет массив строк и будет передавать каждую строку как отдельное сообщение дальше.
    • Шаг 3: Узел «Set» (или «Template»). Формируем тело письма, используя данные из текущей итерации (например, `{{ $json[‘Name’] }}`, `{{ $json[‘OrderId’] }}`).
    • Шаг 4: Узел «SMTP». Настраиваем отправку. Поле «To» берется из `{{ $json[‘Email’] }}`.

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

    Пример 2: Сбор данных из нескольких страниц пагинированного API

    Цель: Получить все записи с API, которое возвращает данные постранично.

    • Шаг 1: Узел «HTTP Request» (Настройка №1). Делаем первый запрос к API (например, к page=1). В ответе получаем массив данных и общее количество страниц (total_pages).
    • Шаг 2: Узел «Function» или «Code». Пишем скрипт, который генерирует массив номеров страниц от 2 до total_pages. На выходе — массив типа [2,3,4,…].
    • Шаг 3: Узел «Split In Batches». Подаем на вход массив номеров страниц. Batch Size = 1.
    • Шаг 4: Узел «HTTP Request» (Настройка №2). Настраиваем его на использование номера страницы из текущей итерации (`{{ $json }}`) как параметра запроса ?page={{ $json }}.
    • Шаг 5: Узел «Wait» (опционально). Добавляем задержку 1 секунду между запросами, чтобы не нагружать API.
    • Шаг 6: Узел «Merge». Объединяем данные с первой страницы (из Шага 1) и со всех последующих страниц (из Шага 4) в один общий массив.

    Пример 3: Обработка вложенных данных с помощью узла Code

    Цель: Для каждого проекта, полученного из API, получить список задач по этому проекту.

    • Шаг 1: Узел «HTTP Request». Получаем список проектов.
    • Шаг 2: Узел «Code» (JavaScript). Пишем скрипт с использованием асинхронного цикла:
    const projects = $input.all();
    const results = [];
    
    for (const project of projects) {
      // Делаем запрос к API задач для каждого project.id
      const tasks = await $http.get(`https://api.example.com/tasks?projectId=${project.json.id}`);
      // Добавляем задачи в проект
      project.json.tasks = tasks.data;
      results.push(project.json);
    }
    
    return results;
    

    Этот пример демонстрирует создание сложного цикла с внутренними HTTP-запросами, что сложно реализовать только стандартными узлами.

    Сравнительная таблица методов организации циклов

    Метод/Узел Лучший сценарий использования Преимущества Недостатки/Ограничения
    Split In Batches Последовательная обработка элементов массива, работа с API, поддерживающими только единичные операции. Простота настройки, наглядность потока данных, возможность установки размера батча. Ограниченная гибкость. Сложно реализовать вложенные или нелинейные циклы.
    Code Node (JavaScript/Python) Сложная логика, вложенные циклы, агрегация данных из нескольких источников внутри одной итерации, работа с асинхронными операциями. Максимальная гибкость и контроль, возможность реализации любой логики. Требует навыков программирования, менее нагляден в рамках общего workflow.
    Trigger Workflow + Sub-Workflow Параллельная обработка независимых элементов, изоляция сложной логики в отдельный workflow. Параллелизм, переиспользование кода, чистота основного workflow. Сложнее в отладке, требует настройки вебхуков или триггеров.

    Ключевые принципы и лучшие практики работы с циклами

    • Идентификация элемента итерации: Внутри цикла данные текущей итерации доступны через переменную `$json`. Данные из первой входной ноды массива доступны через `$input.all()`. Важно четко понимать, с какой структурой данных вы работаете на каждом шаге.
    • Обработка ошибок: При сбое в одной итерации цикла весь workflow может остановиться. Используйте узел «Error Trigger» или настройку «Continue on Fail» на конкретных узлах внутри цикла, чтобы обрабатывать ошибки без остановки всего процесса.
    • Производительность и лимиты:
      • Избегайте бесконечных циклов, всегда делайте условие выхода.
      • При работе с внешними API добавляйте паузы (узел «Wait») между итерациями, чтобы соблюдать rate limits.
      • Для обработки очень больших массивов данных рассмотрите возможность использования батчей (Batch Size > 1) для оптимизации.
    • Отладка: Включайте режим отладки (Execute Node) для узла «Split In Batches» или «Code», чтобы увидеть данные на входе и выходе каждой итерации. Используйте узлы «No Operation» или «Function» для логирования промежуточных данных.

Ответы на часто задаваемые вопросы (FAQ)

Вопрос 1: Как остановить или прервать цикл досрочно при выполнении определенного условия?

Стандартные узлы типа «Split In Batches» не поддерживают досрочный выход. Реализация требует использования узла «Code». Внутри скрипта можно использовать команду `break` для выхода из цикла. Альтернативно, можно фильтровать входящий массив до попадания в цикл, используя узел «Filter» или «IF», чтобы удалить ненужные элементы.

Вопрос 2: Можно ли запускать итерации цикла параллельно, а не последовательно?

Да, для этого используется подход с активацией подчиненных workflow (Sub-workflow). Основной workflow создает массив элементов, а затем с помощью узла «HTTP Request» (Webhook) или «n8n API Trigger» запускает новый экземпляр подчиненного workflow для каждого элемента, передавая его данные. В настройках подчиненного workflow необходимо включить опцию «Trigger on incoming webhook». Это позволяет обрабатывать элементы одновременно, если позволяет инфраструктура.

Вопрос 3: Как передать данные из предыдущей итерации в следующую внутри «Split In Batches»?

По умолчанию «Split In Batches» в режиме «Reset» не передает данные между итерациями. Если вам нужно аккумулировать данные (например, собирать общую сумму), отключите опцию «Reset» в настройках узла. Тогда выходные данные каждой итерации будут добавляться к результатам предыдущих и станут доступны в последующих итерациях через `$input.all()`. Будьте осторожны, это может привести к нежелательному росту объема данных в памяти.

Вопрос 4: Чем отличается «Split In Batches» от «Split Out»?

Узел «Split Out» (часто называемый «Item Lists») принимает массив на вход и выдает несколько отдельных выходных элементов, по одному на каждый элемент массива. Он делает это одномоментно, создавая несколько параллельных ветвей выполнения. «Split In Batches» же обрабатывает элементы последовательно, один за другим (или батчами), в рамках одной линии выполнения. «Split Out» подходит для параллельной обработки независимых элементов, когда последующие узлы могут работать одновременно.

Вопрос 5: Как обработать в цикле не массив, а выполнить действие N раз?

Создайте узел «Function» или «Code», который сгенерирует массив из N элементов (например, `Array.from({length: 10}, (v, i) => i)` создаст [0,1,2,…,9]). Подайте этот массив на вход узлу «Split In Batches». Каждое число (или объект) из этого массива станет входными данными для одной итерации.

Заключение

Циклы являются фундаментальным инструментом для создания эффективных и мощных автоматизаций в n8n. Понимание различий между узлом «Split In Batches» для последовательной обработки, узлом «Code» для гибкого скриптования и подходом с активацией подчиненных workflow для параллельного выполнения позволяет решать широкий спектр задач: от массовой рассылки до сложной агрегации данных из множества источников. Ключ к успешной реализации — четкое проектирование потока данных, учет ограничений внешних систем и использование лучших практик по обработке ошибок и отладке. Освоив работу с циклами, вы значительно расширите возможности автоматизации бизнес-процессов с помощью n8n.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *