N8n переменные: полное руководство по контекстам, синтаксису и практическому применению
Переменные в n8n являются фундаментальным механизмом для передачи, преобразования и хранения данных между узлами в рабочем процессе. В отличие от многих других платформ, n8n использует концепцию контекстно-зависимых переменных, что обеспечивает гибкость и четкое разделение данных. Каждый узел в workflow может получать входные данные, обрабатывать их и возвращать выходные данные, которые становятся доступными для последующих узлов через специальные выражения. Понимание системы переменных — ключ к созданию сложных, динамичных и эффективных автоматизаций.
Контексты переменных в n8n
Данные в n8n организованы в четкие контексты, которые определяют область видимости и источник переменных. Доступ к ним осуществляется через выражения (expressions) в полях, активируемые двойными фигурными скобками {{ }}.
Основные контексты переменных:
- $json: Самый часто используемый контекст. Содержит данные, выходящие из предыдущего узла. Каждый узел возвращает JSON-объект, и его свойства доступны через
$json. Например, если узел HTTP Request возвращает объект{ "id": 123, "name": "John" }, то в следующем узле можно использовать{{ $json.id }}и{{ $json.name }}. - $node: Позволяет обращаться к выходным данным любого узла в workflow по его имени. Это мощный инструмент для доступа к информации не только из непосредственно предыдущего узла. Синтаксис:
{{ $node["Node Name"].$json["property"] }}или упрощенный вариант{{ $node["Node Name"].json["property"] }}. - $items: Ключевой контекст для работы с циклами (например, внутри узла Loop Over Items). Он представляет текущий элемент в итерации. Индекс элемента доступен через
{{ $index }}(начинается с 0). - $env и
$secrets: Контексты для доступа к переменным окружения и секретам.$envиспользуется для значений, заданных в настройках n8n (Settings > Variables), а$secrets— для безопасного хранения конфиденциальных данных типа токенов API или паролей. Синтаксис:{{ $env.VARIABLE_NAME }}и{{ $secrets.SECRET_NAME }}. - $now и $today: Специальные переменные для работы с датой и временем.
$nowвозвращает текущую дату и время,$today— текущую дату с обнуленным временем (00:00:00). С ними можно выполнять операции, например,{{ $now.plus(2, 'days') }}. - $execution: Предоставляет метаданные о текущем выполнении workflow, такие как
$execution.id(уникальный ID запуска) и$execution.resumeUrl(URL для ручного возобновления workflow, полезно в Wait узле). - $binary: Используется для работы с бинарными данными (изображения, файлы). Позволяет получить имя файла, mime-type или данные в base64.
- $runIndex: Показывает порядковый номер текущей итерации выполнения узла (начинается с 0). Полезно для отладки циклов.
- $input: Позволяет получить все данные, пришедшие на вход узла, включая данные от нескольких веток. Используется в продвинутых сценариях.
- $workflow: Содержит информацию о workflow:
$workflow.idи$workflow.name. - $vars (или $variables): Контекст для пользовательских переменных, заданных в узле Set. Это основной способ создания собственных переменных внутри потока.
- Доступ к свойствам объекта:
{{ $json.property }}или{{ $json["property with spaces"] }}. - Доступ к элементам массива:
{{ $json.array[0] }}. - Цепочка свойств:
{{ $json.data.user.email }}. {{ $json.text.toUpperCase() }}— преобразование в верхний регистр.{{ "Hello " + $json.name }}— конкатенация.{{ $json.text.slice(0, 5) }}— получение подстроки.{{ $json.sku.replace("-", "_") }}— замена части строки.{{ 10 + $json.value }}— сложение.{{ Math.max($json.num1, $json.num2) }}— использование объекта Math.{{ $json.price— вычисление с НДС.- 1.2 }}
{{ $now.format("YYYY-MM-DD HH:mm:ss") }}— форматирование даты.{{ $now.minus(1, 'hour').format() }}— вычитание времени.{{ $json.date.isBetween($today, $today.plus(1, 'week')) }}— проверка вхождения в интервал.{{ $json.tags.join(", ") }}— объединение массива в строку.{{ $json.numbers.map(n => n— преобразование массива (возвращает массив).- 2) }}
{{ $json.items.filter(item => item.active) }}— фильтрация массива.{{ $json.items.length }}— получение длины массива.{{ $json.age > 18 ? "adult" : "minor" }}— тернарный оператор.{{ $json.value1 && $json.value2 }}— логическое И.{{ !$json.isCompleted }}— логическое НЕ.- Name: Имя переменной (например, "formattedDate").
- Value: Выражение, вычисляющее значение (например,
{{ $now.format("YYYY-MM-DD") }}). - Type: Можно явно указать тип (String, Number, Boolean и т.д.).
$input: Для получения всех входных данных.items: Массив входных элементов.$json: Данные текущего элемента (при работе в режиме по одному элементу).- Для возврата данных нужно использовать
return items.map(item => { ... })илиreturn [ { json: { newField: "value" } } ]. - Condition:
{{ $json.temperature }} > 30— если температура больше 30. - Combine Conditions:
{{ ($json.status === "active") && ($json.priority === "high") }}. - $json.quantity }}). В последующих узлах обращайтесь к этой переменной через контекст
$vars:{{ $vars.totalAmount }}.
Синтаксис выражений и функций
Выражения в n8n используют синтаксис, похожий на JavaScript, и поддерживают широкий спектр встроенных функций для манипуляции данными.
Базовый синтаксис:
Ключевые категории функций:
1. Строковые функции:
2. Математические функции и операции:
3. Функции для работы с датами:
4. Функции для работы с массивами:
5. Логические функции и условные выражения:
Практическое применение переменных в узлах
Узел Set (Задание переменных)
Это центральный узел для создания и модификации переменных внутри потока. Он позволяет сохранить вычисленное значение для многократного использования в последующих узлах, избегая сложных выражений.
После выполнения узла Set переменная становится доступна через контекст $vars (например, {{ $vars.formattedDate }}).
Узел Code (JavaScript / Python)
Позволяет писать произвольный код для сложных операций с данными. Внутри узла доступны специальные объекты:
Узел IF (Ветвление)
В условиях ветвления активно используются переменные и выражения.
Узел Loop Over Items (Цикл)
Внутри цикла контекст $items содержит текущий элемент. $index — его порядковый номер. Это позволяет обрабатывать массивы данных, например, отправлять индивидуальные письма или создавать записи в БД для каждого элемента.
Таблица: Сводка по основным контекстам переменных
| Контекст | Описание | Пример использования |
|---|---|---|
$json |
Данные, полученные от непосредственно предыдущего узла. | {{ $json.email }} |
$node |
Данные от любого узла в workflow по его имени. | {{ $node["HTTP Request"].json["id"] }} |
$items |
Текущий элемент внутри цикла (Loop Over Items). | {{ $items.body }} |
$env |
Переменные окружения, заданные в настройках n8n. | {{ $env.API_URL }} |
$secrets |
Секретные переменные (токены, пароли). | {{ $secrets.SENDGRID_API_KEY }} |
$now / $today |
Текущая дата-время и текущая дата. | {{ $now.plus(7, 'days').format() }} |
$vars |
Пользовательские переменные, созданные в узле Set. | {{ $vars.fullName }} |
$execution |
Метаданные текущего выполнения workflow. | {{ $execution.id }} |
$input |
Все входные данные узла (включая данные из нескольких веток). | Используется внутри узла Code. |
Ответы на часто задаваемые вопросы (FAQ)
Как получить данные не из предыдущего узла, а из узла, расположенного раньше в workflow?
Используйте контекст $node. Укажите точное имя нужного узла в квадратных скобках: {{ $node["Имя узла"].json["Нужное поле"] }}. Убедитесь, что имя узла указано без ошибок, учитывая регистр и пробелы.
В чем разница между $env и $secrets?
Оба хранятся в настройках n8n, но имеют разное назначение. $env предназначен для обычных переменных окружения (например, URL API, ID проекта). $secrets используется исключительно для конфиденциальной информации. В интерфейсе n8n значения $secrets скрыты (отображаются как точки), и они могут иметь дополнительные ограничения на логирование для повышения безопасности.
Почему мое выражение {{ $json.field }} возвращает [object Object]?
Это означает, что значение field является объектом или массивом, а не примитивным типом (строка, число). Чтобы получить конкретное свойство из этого объекта, уточните путь: {{ $json.field.subfield }}. Для отладки используйте узел Code, чтобы вывести полную структуру $json.
Как создать свою переменную и использовать ее в другом узле?
Используйте узел Set. В поле "Name" задайте имя переменной (например, totalAmount). В поле "Value" укажите выражение для вычисления значения (например, {{ $json.price
Как работать с массивами данных в цикле?
Используйте узел Loop Over Items. На его вход подайте массив данных (например, [ { "id": 1 }, { "id": 2 } ]). Внутри цикла (в узлах, расположенных после Loop Over Items) каждый элемент массива будет доступен через контекст $items (например, {{ $items.id }}), а его индекс — через {{ $index }}.
Можно ли использовать JavaScript функции в выражениях?
Да, n8n поддерживает множество стандартных JavaScript-функций и объектов, таких как Math, String, Array (например, Math.round(), .split(), .join(), .map()). Однако это не полная среда выполнения JS, а специальный движок выражений, поэтому некоторые возможности могут быть ограничены. Для сложной логики предпочтительнее использовать узел Code.
Как форматировать дату и время?
Используйте метод .format() для переменных $now и $today. Внутри скобок можно указать строку формата: {{ $now.format("DD.MM.YYYY") }} (день.месяц.год) или {{ $now.format("HH:mm") }} (часы:минуты). Полный список спецификаторов формата доступен в документации библиотеки Luxon, которую использует n8n.
Что делать, если узел возвращает несколько элементов (пакет данных)?
N8n работает с пакетами данных (arrays of json objects). Многие узлы обрабатывают их автоматически. Для доступа к конкретному элементу в выражении можно использовать индекс: {{ $json[0].field }} для первого элемента. В узле Code весь пакет доступен через массив items.
Как обработать ситуацию, когда переменная может быть не определена (undefined)?
Используйте условный (тернарный) оператор или логический оператор ИЛИ (||) для задания значения по умолчанию: {{ $json.optionalField || "default_value" }}. Это предотвратит ошибки выполнения workflow.
Заключение
Система переменных и выражений n8n представляет собой мощный и гибкий инструмент для построения логики автоматизаций. Ее основа — четкое разделение данных по контекстам ($json, $node, $vars, $env и др.), что обеспечивает предсказуемость и контролируемость потоков данных. Комбинирование встроенных функций, узлов Set и Code позволяет реализовывать преобразования любой сложности — от простой конкатенации строк до динамического формирования запросов к API и обработки массивов. Глубокое понимание принципов работы с переменными является необходимым условием для перехода от создания простых линейных сценариев к проектированию комплексных, надежных и эффективных бизнес-процессов в n8n.
Добавить комментарий