N8n Set Node: Детальное руководство по узлу для манипуляции данными
Узел Set (Установить) в n8n является одним из наиболее мощных и часто используемых инструментов для обработки, преобразования и структурирования данных внутри рабочих процессов (workflows). Его основное назначение — создание, модификация, удаление и организация полей (ключей) в JSON-объектах, которые представляют собой элементы данных, передаваемые между узлами. В отличие от простого узла Code, Set node предоставляет интуитивно понятный графический интерфейс для выполнения этих операций, что делает его доступным для пользователей без глубоких знаний программирования, но при этом сохраняет гибкость для решения сложных задач.
Принцип работы и место в рабочем процессе
Узел Set работает с каждым входным элементом (item) по отдельности. Каждый элемент — это объект JSON, содержащий пары ключ-значение. Узел принимает этот объект, применяет к нему заданные операции и выдает на выходе модифицированный объект. Он может быть размещен в любой части workflow: в начале для подготовки данных, в середине для преобразования выходов предыдущих узлов или в конце для финального форматирования перед отправкой в целевую систему (базу данных, API, таблицу).
Режимы работы узла Set
Узел Set предлагает несколько режимов работы, которые определяют, как будут комбинироваться исходные данные и новые значения. Выбор режима критически важен для получения ожидаемого результата.
Режим 1: «Set» (Установить) — Режим по умолчанию
В этом режиме узел добавляет новые поля к существующему объекту. Если поле с таким именем уже существует, его значение перезаписывается. Остальные поля, не затронутые операциями, остаются без изменений.
- Входной объект:
{ "id": 1, "name": "OldName" } - Операция: Установить поле
name = "NewName"и полеstatus = "active". - Выходной объект:
{ "id": 1, "name": "NewName", "status": "active" } - Входной объект:
{ "id": 1, "name": "Test", "tempData": "x", "log": "error" } - Операция: Удалить поля
tempDataиlog. - Выходной объект:
{ "id": 1, "name": "Test" } - Входной объект:
{ "id": 1, "name": "Test", "email": "test@mail.com", "role": "user" } - Операция: Оставить только поля
idиemail. - Выходной объект:
{ "id": 1, "email": "test@mail.com" } - Входной объект:
{ "user_id": 101, "full_name": "John Doe" } - Выходной объект:
{ "id": 101, "name": "John Doe" } - Узел 1: Google Sheets Node — получает строку с
clientEmailиclientName. - Узел 2: HTTP Request Node — делает запрос к CRM API, передавая
{{ $json.clientEmail }}, получаетlastOrderIdиtotalSpent. - Узел 3: Set Node — работает в режиме «Set». Добавляет к существующим полям (
clientEmail,clientName,lastOrderId,totalSpent) новое вычисляемое полеmessageсо значением выражения:{{ $json.clientName }} ({{ $json.clientEmail }}) last order:.
{{ $json.lastOrderId }}
- Узел 4: Telegram Node — отправляет сформированное сообщение.
- Входные данные:
{ "Имя_пользователя": "Иван", "возраст_лет": "30", "не нужное поле": "мусор", "timestamp": 1678886400000 } - Настройки Set Node:
- Режим: «Rename». Переименовать
Имя_пользователя->name,возраст_лет->age. - Затем добавить операцию в режиме «Set»: Добавить поле
registration_dateсо значением выражения{{ new Date($json.timestamp).toISOString().split('T')[0] }}(преобразует timestamp в строку даты). - Добавить еще одну операцию в режиме «Remove»: Удалить поля
не нужное полеиtimestamp.
- Режим: «Rename». Переименовать
- Выходные данные:
{ "name": "Иван", "age": "30", "registration_date": "2023-03-16" } - Цепочка Set Node: Для сложных преобразований можно использовать несколько узлов Set последовательно. Это улучшает читаемость workflow, так как каждая группа операций (очистка, обогащение, переименование) будет изолирована в своем узле.
- Использование функций в Expression Editor: Максимально задействуйте встроенные функции для работы со строками, датами и математических операций. Например,
{{ $json.priceдля расчета цены с налогом или- 1.2 }}
{{ $json.notes.slice(0, 100) }}...для обрезки длинного текста. - Работа с вложенными объектами: Set Node позволяет устанавливать значения по сложным путям. Например, можно создать структуру: Установить поле
contact.address.city= «London». На выходе получится объект{ "contact": { "address": { "city": "London" } } }. - Обработка отсутствующих полей: При использовании выражений, ссылающихся на несуществующие поля, может возникнуть ошибка. Используйте функцию
get()для безопасного доступа:{{ $json.get('optionalField', 'default_value') }}.
Режим 2: «Remove» (Удалить)
Этот режим используется для удаления указанных полей из объекта. Все остальные поля сохраняются.
Режим 3: «Keep Only» (Оставить только)
Противоположность режиму «Remove». Сохраняются только те поля, которые явно указаны в настройках узла. Все остальные поля удаляются из объекта.
Режим 4: «Rename» (Переименовать)
Позволяет изменить название поля (ключа) без изменения его значения. Удобно для приведения данных к единому стандарту, необходимому для следующего узла.
Операция: Переименовать user_id в id и full_name в name.
Типы значений и использование Expression Editor
При установке значения для нового или существующего поля можно выбрать один из нескольких типов, что значительно расширяет возможности узла.
| Тип значения | Описание | Пример использования |
|---|---|---|
| String / Number / Boolean | Статическое значение, вводимое вручную. | Установить поле «priority» в значение «high» (String) или «attempts» в 5 (Number). |
| Expression | Динамическое значение, вычисляемое с помощью встроенного редактора выражений n8n. Позволяет использовать данные из предыдущих узлов, функции и переменные. | {{ $json.itemId }} - {{ $now.format("YYYY-MM-DD") }} создаст строку, объединяющую ID элемента и текущую дату. |
| Binary | Позволяет установить двоичные данные (например, изображение или файл) из предыдущего узла. | Присвоить полю «attachment» бинарный файл, загруженный узлом HTTP Request. |
| Array / Object | Позволяет вручную или через выражение задать структурированное значение в формате JSON-массива или объекта. | Создать поле «tags» со значением ["urgent", "client"] или поле «address» со значением { "city": "Berlin", "zip": "10115" }. |
Практические примеры и сценарии использования
Сценарий 1: Обогащение данных из разных источников
Задача: объединить данные из Google Sheets (контакты) и CRM API (информация о заказах) в одну запись для отправки в Telegram.
Сценарий 2: Стандартизация и очистка данных
Задача: подготовить данные из неструктурированной формы для записи в базу данных.
Сравнение с другими узлами для работы с данными
| Узел | Основное назначение | Когда использовать вместо Set Node |
|---|---|---|
| Code Node | Выполнение произвольного кода (JavaScript/Python) для сложных манипуляций, алгоритмов, которые невозможно выразить через Set Node. | Когда требуется сложная логика (циклы, условия высокой вложенности), работа с несколькими элементами одновременно или использование внешних npm-пакетов. |
| Item Lists Node (Split Out / Aggregate / Limit) | Управление потоком элементов: разделение, объединение, ограничение количества, сортировка. | Когда нужно разбить массив внутри одного элемента на несколько отдельных элементов (Split Out) или, наоборот, агрегировать множество элементов в один (Aggregate). Set Node работает в рамках одного элемента. |
| Remove Duplicates Node | Фильтрация дубликатов элементов по заданному ключу. | Для удаления повторяющихся записей в потоке данных. Set Node не может этого сделать. |
Продвинутые техники и лучшие практики
Ответы на часто задаваемые вопросы (FAQ)
Вопрос: Как в Set Node добавить новое поле, значение которого — это массив данных из предыдущих шагов?
Ответ: В типе значения выберите «Array». В интерфейсе появится возможность добавить элементы массива. Каждый элемент массива может быть статическим значением или выражением. Например, чтобы создать массив тегов на основе нескольких полей, можно вручную добавить элементы и в каждом указать выражение вида {{ $json.tag1 }}, {{ $json.tag2 }}. Для динамического формирования массива из другого массива используйте Expression: {{ $json.existingArray }}.
Вопрос: Можно ли в одном узле Set выполнить несколько разных операций: переименовать одно поле, удалить другое и добавить новое?
Ответ: Да, это возможно. В интерфейсе узла для каждой операции можно выбрать свой «Operation». Вы можете добавить несколько строк, в каждой из которых выбрать свой режим (Set, Remove, Keep Only, Rename) и задать соответствующие поля. Операции выполняются сверху вниз в том порядке, в котором они указаны в настройках узла.
Вопрос: Чем отличается режим «Keep Only» от удаления всех полей кроме нужных через несколько операций «Remove»?
Ответ: Функционально результат идентичен. Однако «Keep Only» является более декларативной и безопасной операцией. Вы явно указываете, что должно остаться, а не что должно быть удалено. Это снижает риск ошибки, если структура входных данных со временем изменится и появятся новые, неизвестные поля, которые при использовании «Keep Only» будут автоматически отфильтрованы.
Вопрос: Как обработать все входящие элементы в одном узле Set, но с разными условиями для разных элементов?
Ответ: Сам по себе узел Set не имеет встроенных условных конструкций (if-else). Для условной модификации данных необходимо:
1. Использовать узел «IF» для разделения потока элементов по условию.
2. Подключить к каждой ветке свой узел Set с уникальными настройками.
3. Объединить потоки обратно с помощью узла «Merge».
Альтернативно, для простых условий можно использовать Expression в значении поля с тернарным оператором: {{ $json.value > 10 ? "high" : "low" }}.
Вопрос: Почему мое выражение в Set Node возвращает «[object Object]» вместо ожидаемого значения?
Ответ: Это происходит, когда выражение возвращает объект или массив, но тип значения в настройках поля установлен как «String». n8n пытается привести объект к строке, что и дает результат «[object Object]». Чтобы исправить это, необходимо явно указать тип значения «Object» или «Array», либо в выражении сериализовать объект в строку, например, с помощью {{ JSON.stringify($json.someObject) }}, если нужна именно строка JSON.
Вопрос: Как скопировать значение из одного поля в другое внутри одного элемента?
Ответ: Добавьте новую операцию в режиме «Set». В качестве имени нового поля укажите целевое имя. В значении выберите тип «Expression» и укажите ссылку на исходное поле: {{ $json.sourceFieldName }}. Если нужно переименовать поле (старое имя удалить), лучше использовать режим «Rename».
Комментарии